Java-как создать новую запись (ключ, значение)
Я хотел бы создать новый элемент, который аналогично Util.Map.Entry Что будет содержать структуру key,value.
проблема в том, что я не могу инстанцировать Map.Entry потому что это интерфейс.
кто-нибудь знает, как создать новый универсальный ключ/значение объекта на карте.Вход?
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часть имени ввести вас в заблуждение: это на самом деле не anabstractкласс (но его верхний уровеньAbstractMapесть).тот факт, что это
staticвложенный класс означает, что вы НЕ необходимость включенияAbstractMapэкземпляр для его создания, поэтому что-то вроде этого компилируется отлично:Map.Entry<String,Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);как отмечено в другом ответе, гуава также имеет удобный
staticзаводской методMaps.immutableEntryчто вы можете использовать.
Вы сказали:
я не могу использовать
Map.Entryсам, потому что, по-видимому, это объект только для чтения, который я не могу создать экземпляр newinstanceofэто не совсем точно. Причина, по которой вы не можете создать его напрямую (т. е. с
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