構造体key
、value
を含むUtil.Map.Entry
と同様の新しいアイテムを作成したいと思います。
問題は、Map.Entry
はインターフェースなのでインスタンス化できないことです。
Map.Entryの新しい汎用キー/値オブジェクトを作成する方法を知っている人はいますか?
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
の部分を誤解させないでください。実際には _は_ ではなくabstract
クラスです(ただし、その最上位レベルの AbstractMap
は).
それがstatic
ネストクラスであるという事実は、インスタンス化するために DON'T を囲むAbstractMap
インスタンスが必要であることを意味します。
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
別の回答で述べたように、Guavaには便利なstatic
ファクトリメソッド Maps.immutableEntry
もあります。
あなたが言った:
Map.Entry
自体を使用することはできません。なぜなら、それは新しいinstanceof
をインスタンス化できないのは明らかに読み取り専用のオブジェクトだからです。
それは完全に正確というわけではありません。直接(つまりnew
で)インスタンス化できないのは、それが interface Map.Entry
だからです。
ドキュメントに記載されているように、AbstractMap.SimpleEntry
は@since 1.6
なので、5.0に固定されている場合は利用できません。
implements Map.Entry
という別の既知のクラスを探すには、実際には直接javadocにアクセスできます。 Java 6バージョン から
インタフェースMap.Entry
すべての既知の実装クラス:
残念なことに 1.5 version はあなたが使うことができる既知の実装クラスをリストしていないので、あなたはあなた自身の実装で行き詰まっているかもしれません。
Maps.immutableEntry から Guava を試してください
これには、Java 5と互換性があるという利点があります(Java 6が必要なAbstractMap.SimpleEntry
とは異なります)。
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
グラフ構造の辺を定義するのに適しています。あなたの頭の中のニューロン間のもののように。
Java 9から始まって、Map#entry(Object, Object)
である不変エントリを作成することを可能にする新しいユーティリティメソッドがあります。
これは簡単な例です:
Entry<String, String> entry = Map.entry("foo", "bar");
不変なので、setValue
を呼び出すとUnsupportedOperationException
がスローされます。他の制限は、それが直列化できず、キーまたは値としてのnull
が禁じられているという事実です。それがあなたにとって受け入れられないなら、あなたは AbstractMap.SimpleImmutableEntry
または を使う必要があるでしょう/] AbstractMap.SimpleEntry
.
なぜMap.Entry
ですか?私はキーと値のペアのようなものがそのケースに適していると思います。
Java.util.AbstractMap.SimpleImmutableEntry
またはJava.util.AbstractMap.SimpleEntry
を使用
あなたは実際に行くことができます:Map.Entry<String, String> en= Maps.immutableEntry(key, value);
org.Apache.commons.lang3.Tuple.Pair
はJava.util.Map.Entry
を実装しており、スタンドアロンでも使用できます。
また他の人が述べたようにGuavaのcom.google.common.collect.Maps.immutableEntry(K, V)
がトリックをする。
流暢なPair.of(L, R)
構文のために私はPair
を好みます。
私はいつも使っているジェネリックなPairクラスを定義しました。それは素晴らしい。おまけとして、静的ファクトリメソッド(Pair.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))