Я'd, как, чтобы создать новый элемент, аналогично утиль.Карте.Запись
, который будет содержать ключевые структуры`,
значение`.
Проблема в том, что я могу'т инстанцировать карты.Запись, потому что она'с интерфейсом.
Кто-нибудь знает, как создать новый универсальный ключ/значение объекта на карте.Запись?
Там'ы публичный статический класс AbstractMap.SimpleEntry<K,V>
. Дон'т пусть абстрактное
часть имени ввести вас в заблуждение: это на самом деле НЕ является абстрактное
класс (но ее верхнего уровня AbstractMap
есть).
Тот факт, что она'ы статический вложенный класс означает, что вы _DON'быть, с необходимостью включающего
AbstractMap` экземпляр, чтобы инстанцировать его, что-то вроде этого компилируется нормально:
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
Как отмечалось в другой ответ, гуава также имеет удобный статический метод фабрики Maps.immutableEntry
, которые вы можете использовать.
Вы сказали:
Я могу'т использовать карту.Запись
себя, потому что, видимо, это'ы только для чтения объект, который я могу'т инстанцировать новый оператор instanceof
Что's не совсем точно. Причина, почему вы можете'т инстанцировать его напрямую (т. е. с "новым") потому, что он'ы Map интерфейс.Запись
.
Как отмечается в документации, AbstractMap.SimpleEntry
это `@с 1.6, так что если вы'вновь застрял на 5.0, потом он's не доступны для вас.
Искать другого известного класса, что реализуется карте.Запись`, вы можете перейти непосредственно к javadoc. С с Java 6 версия
интерфейс карте.Запись<К в>
все известные реализации классов:
К сожалению, 1.5 версия не содержит каких-либо известному классу исполнителей, которые вы можете использовать, так что вы можете быть застрял с реализации собственных.
Вы можете просто реализовать карты.Запись<К в>` интерфейс себя:
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());
Попробовать Maps.immutableEntry от фейхоа
Это имеет преимущество того, чтобы быть совместимым с Java 5 (в отличие от `AbstractMap.SimpleEntry, по которым требуется Java 6.)
Пример AbstractMap.SimpleEntry:
import java.util.Map;
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
Создать:
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));
Выборка строк:
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 хорошо для определения границ графической структуры. Как те между нейронами в вашей голове.
Начиная с Ява 9, появился новый способ утилиты, позволяющие создать неизменяемый запись карта#запись(объект, объект)
.
Вот простой пример:
Entry<String, String> entry = Map.entry("foo", "bar");
Как это неизменным, вызова метода setValueбросит
возникновению unsupportedoperationexception. Другие ограничения на то, что он не является сериализуемым и
нульв качестве ключа или значения запрещено, если это не приемлемо для вас, вам нужно будет использовать [
AbstractMap.SimpleImmutableEntry][2] или [
AbstractMap.SimpleEntry`]3 вместо этого.
Примечание: Если ваша потребность заключается в создании непосредственно с "карта" с 0 до 10 (ключ, значение) пары, вместо этого можно использовать методы типа карте.(к ключ1, значение1 в, ...)
.
Вы могли бы пойти с: Карты.Запись на<строка, string> Ен= карты.immutableEntry(ключ, значение);`
Почему Карте.Запись`? Я думаю, что-то типа ключ-значение пары, пригодный для дела.
Используйте Ява.утиль.AbstractMap.SimpleImmutableEntry " или " Ява.утиль.AbstractMap.SimpleEntry
орг."Апач".общин.lang3.кортеж.Пара
реализует Ява.утиль.Карте.Запись
, а также может использоваться автономно.
Также как и другие упомянутые гуава'ы ком.Гугл.общие.собираем.Карты.immutableEntry(К, в)
делает трюк.
Я предпочитаю пара
для пара его свободно`.(Л, Р) синтаксис.
Я определил родовой пары классов, которые я использую все время. Это'ы большой. В качестве бонуса, определив статический метод фабрики (пара.создать) я только писать аргументы типа вдвое реже.
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))