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



Я хотел бы создать новый элемент, который аналогично Util.Map.Entry Что будет содержать структуру key,value.



проблема в том, что я не могу инстанцировать Map.Entry потому что это интерфейс.



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

578   9  

9 ответов:

вы можете просто использовать тег Map.Entry<K, V> интерфейс себе:

import java.util.Map;

final class MyEntry<K, V> implements Map.Entry<K, V> {
    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<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());

здесь public static class AbstractMap.SimpleEntry<K,V>. Не позволяйте Abstract часть имени ввести вас в заблуждение: это на самом деле не an abstract класс (но его верхний уровень AbstractMap есть).

тот факт, что это static вложенный класс означает, что вы НЕ необходимость включения AbstractMap экземпляр для его создания, поэтому что-то вроде этого компилируется отлично:

Map.Entry<String,Integer> entry =
    new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);

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


Вы сказали:

я не могу использовать Map.Entry сам, потому что, по-видимому, это объект только для чтения, который я не могу создать экземпляр new instanceof

это не совсем точно. Причина, по которой вы не можете создать его напрямую (т. е. с new), потому что это interface Map.Entry.


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

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

искать другой известный класс implements Map.Entry на самом деле можно перейти непосредственно к javadoc. От версия Java 6

Интерфейс Карте.Запись

Все Известные Классы Реализации:

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

попробовать карты.неизменное С гуавы

это имеет преимущество совместимости с Java 5 (в отличие от AbstractMap.SimpleEntry который требует Java 6.)

пример AbstractMap.SimpleEntry:

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

Instantiate:

ArrayList<Map.Entry<Integer, Integer>> arr = 
    new ArrayList<Map.Entry<Integer, Integer>>();

добавить строки:

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

Fetch строк:

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

это хорошо для определения ребер графовых структур. Как те, что между нейронами в твоей голове.

почему Map.Entry? Я думаю, что-то вроде пары ключ-значение подходит для этого случая.

использовать java.util.AbstractMap.SimpleImmutableEntry или java.util.AbstractMap.SimpleEntry

org.apache.commons.lang3.tuple.Pair осуществляет java.util.Map.Entry и может также использоваться автономно.

также, как другие упоминали гуавы com.google.common.collect.Maps.immutableEntry(K, V) делает трюк.

предпочитаю Pair для его свободно Pair.of(L, R) синтаксис.

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

public class Pair<A, B> {

    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 "<" + component1 + "," + component2 + ">";
    }

    @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 <A, B> Pair<A, B> create(A component1, B component2) {
            return new Pair<A, B>(component1, component2);
    }

}

Если вы используете Clojure, у вас есть другой вариант:

(defn map-entry
  [k v]
  (clojure.lang.MapEntry/create k v))

начиная от Java 9, существует новый метод утилиты, позволяющий создать неизменяемую запись, которая Map#entry(Object, Object).

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

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

как он неизменен, вызывая setValue появится UnsupportedOperationException. Другие ограничения заключаются в том, что он не сериализуем и null как ключ или значение запрещено, если это не приемлемо для вас, вам нужно будет использовать AbstractMap.SimpleImmutableEntry или AbstractMap.SimpleEntry.

Comments

    Ничего не найдено.