Ява - как создать новую запись (ключ, значение)

Я'd, как, чтобы создать новый элемент, аналогично утиль.Карте.Запись, который будет содержать ключевые структуры`,значение`.

Проблема в том, что я могу'т инстанцировать карты.Запись, потому что она'с интерфейсом.

Кто-нибудь знает, как создать новый универсальный ключ/значение объекта на карте.Запись?

Там'ы публичный статический класс AbstractMap.SimpleEntry<K,V>. Дон'т пусть абстрактное часть имени ввести вас в заблуждение: это на самом деле НЕ является абстрактное класс (но ее верхнего уровня AbstractMap есть).

Тот факт, что она'ы статический вложенный класс означает, что вы _DON&#39;быть, с необходимостью включающегоAbstractMap` экземпляр, чтобы инстанцировать его, что-то вроде этого компилируется нормально:

Map.Entry entry =
    new AbstractMap.SimpleEntry("exmpleString", 42);

Как отмечалось в другой ответ, гуава также имеет удобный статический метод фабрики Maps.immutableEntry, которые вы можете использовать.


Вы сказали:

Я могу'т использовать карту.Записьсебя, потому что, видимо, это&#39;ы только для чтения объект, который я могу&#39;т инстанцировать новый оператор instanceof

Что's не совсем точно. Причина, почему вы можете'т инстанцировать его напрямую (т. е. с "новым") потому, что он'ы Map интерфейс.Запись.


Предостережение и Совет

Как отмечается в документации, AbstractMap.SimpleEntry это `@с 1.6, так что если вы'вновь застрял на 5.0, потом он's не доступны для вас.

Искать другого известного класса, что реализуется карте.Запись`, вы можете перейти непосредственно к javadoc. С с Java 6 версия

интерфейс карте.Запись<К в>

все известные реализации классов:

К сожалению, 1.5 версия не содержит каких-либо известному классу исполнителей, которые вы можете использовать, так что вы можете быть застрял с реализации собственных.

Комментарии (7)
Решение

Вы можете просто реализовать карты.Запись<К в>` интерфейс себя:

import java.util.Map;

final class MyEntry implements Map.Entry {
    private final K key;
    private V value;

    public MyEntry(K key, V value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public K getKey() {
        return key;
    }

    @Override
    public V getValue() {
        return value;
    }

    @Override
    public V setValue(V value) {
        V old = this.value;
        this.value = value;
        return old;
    }
}

И затем использовать его:

Map.Entry entry = new MyEntry("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
Комментарии (5)

Попробовать Maps.immutableEntry от фейхоа

Это имеет преимущество того, чтобы быть совместимым с Java 5 (в отличие от `AbstractMap.SimpleEntry, по которым требуется Java 6.)

Комментарии (0)

Пример AbstractMap.SimpleEntry:

import java.util.Map; 
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;

Создать:

ArrayList arr = 
    new ArrayList();

Добавьте строки:

arr.add(new AbstractMap.SimpleEntry(2, 3));
arr.add(new AbstractMap.SimpleEntry(20, 30));
arr.add(new AbstractMap.SimpleEntry(2, 4));

Выборка строк:

System.out.println(arr.get(0).getKey());
System.out.println(arr.get(0).getValue());
System.out.println(arr.get(1).getKey());
System.out.println(arr.get(1).getValue());
System.out.println(arr.get(2).getKey());
System.out.println(arr.get(2).getValue());

Необходимо распечатать:

2
3
20
30
2
4

Это's хорошо для определения границ графической структуры. Как те между нейронами в вашей голове.

Комментарии (0)

Начиная с Ява 9, появился новый способ утилиты, позволяющие создать неизменяемый запись карта#запись(объект, объект).

Вот простой пример:

Entry entry = Map.entry("foo", "bar");

Как это неизменным, вызова метода setValueброситвозникновению unsupportedoperationexception. Другие ограничения на то, что он не является сериализуемым инульв качестве ключа или значения запрещено, если это не приемлемо для вас, вам нужно будет использовать [AbstractMap.SimpleImmutableEntry][2] или [AbstractMap.SimpleEntry`]3 вместо этого.

Примечание: Если ваша потребность заключается в создании непосредственно с "карта" с 0 до 10 (ключ, значение) пары, вместо этого можно использовать методы типа карте.(к ключ1, значение1 в, ...).

Комментарии (0)

Вы могли бы пойти с: Карты.Запись на<строка, string> Ен= карты.immutableEntry(ключ, значение);`

Комментарии (0)

Почему Карте.Запись`? Я думаю, что-то типа ключ-значение пары, пригодный для дела.

Используйте Ява.утиль.AbstractMap.SimpleImmutableEntry " или " Ява.утиль.AbstractMap.SimpleEntry

Комментарии (0)

орг."Апач".общин.lang3.кортеж.Пара реализует Ява.утиль.Карте.Запись, а также может использоваться автономно.

Также как и другие упомянутые гуава'ы ком.Гугл.общие.собираем.Карты.immutableEntry(К, в) делает трюк.

Я предпочитаю пара для пара его свободно`.(Л, Р) синтаксис.

Комментарии (3)

Я определил родовой пары классов, которые я использую все время. Это'ы большой. В качестве бонуса, определив статический метод фабрики (пара.создать) я только писать аргументы типа вдвое реже.

public class Pair {

    private A component1;
    private B component2;

    public Pair() {
            super();
    }

    public Pair(A component1, B component2) {
            this.component1 = component1;
            this.component2 = component2;
    }

    public A fst() {
            return component1;
    }

    public void setComponent1(A component1) {
            this.component1 = component1;
    }

    public B snd() {
            return component2;
    }

    public void setComponent2(B component2) {
            this.component2 = component2;
    }

    @Override
    public String toString() {
            return "";
    }

    @Override
    public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                            + ((component1 == null) ? 0 : component1.hashCode());
            result = prime * result
                            + ((component2 == null) ? 0 : component2.hashCode());
            return result;
    }

    @Override
    public boolean equals(Object obj) {
            if (this == obj)
                    return true;
            if (obj == null)
                    return false;
            if (getClass() != obj.getClass())
                    return false;
            final Pair<?, ?> other = (Pair<?, ?>) obj;
            if (component1 == null) {
                    if (other.component1 != null)
                            return false;
            } else if (!component1.equals(other.component1))
                    return false;
            if (component2 == null) {
                    if (other.component2 != null)
                            return false;
            } else if (!component2.equals(other.component2))
                    return false;
            return true;
    }

    public static  Pair create(A component1, B component2) {
            return new Pair(component1, component2);
    }

}
Комментарии (2)

Если вы с помощью Clojure, у вас есть еще один вариант:

(defn map-entry
  [k v]
  (clojure.lang.MapEntry/create k v))
Комментарии (0)