Util.Map.Entry
同様に構造を含むkey
新しいアイテムを作成したいと思いますvalue
。
Map.Entry
問題は、それがインターフェースであるため、インスタンス化できないことです。
Map.Entryの新しい汎用キー/値オブジェクトを作成する方法を知っている人はいますか?
Util.Map.Entry
同様に構造を含むkey
新しいアイテムを作成したいと思いますvalue
。
Map.Entry
問題は、それがインターフェースであるため、インスタンス化できないことです。
Map.Entryの新しい汎用キー/値オブジェクトを作成する方法を知っている人はいますか?
ありpublic static class AbstractMap.SimpleEntry<K,V>
ます。名前の一部に誤解を与えないAbstract
でください。実際にはクラスではありませんabstract
(ただし、そのトップレベルAbstractMap
はクラスです)。
static
それがネストされたクラスであるという事実は、それをインスタンス化するために囲んでいるインスタンスを必要としない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
はです。したがって、5.0に固執している場合は@since 1.6
、使用できません。
別の既知のクラスを探すにimplements Map.Entry
は、実際にはjavadocに直接アクセスできます。Java6バージョンから
インターフェイスMap.Entry
すべての既知の実装クラス:
残念ながら、1.5バージョンには、使用できる既知の実装クラスがリストされていないため、独自の実装クラスで立ち往生している可能性があります。
Java 9以降、不変のエントリを作成できる新しいユーティリティメソッドがありますMap#entry(Object, Object)
。
簡単な例を次に示します。
Entry<String, String> entry = Map.entry("foo", "bar");
不変であるため、呼び出すと。setValue
がスローされUnsupportedOperationException
ます。その他の制限は、シリアル化できないという事実です。null
キーまたは値は禁止されているため、受け入れられない場合は、AbstractMap.SimpleImmutableEntry
またはAbstractMap.SimpleEntry
代わりにを使用する必要があります。
注意:Map
0から最大10(キー、値)のペアを直接作成する必要がある場合は、代わりにタイプのメソッドを使用できますMap.of(K key1, V value1, ...)
。
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());
Guavaの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
グラフ構造のエッジを定義するのに適しています。あなたの頭の中のニューロンの間のもののように。
あなたは実際に行くことができます:
Map.Entry<String, String> en= Maps.immutableEntry(key, value);
Map.Entryのドキュメントを見ると、静的インターフェイス(Mapインターフェイス内で定義されているインターフェイスであり、Map.Entryからアクセスできます)であり、2つの実装があることがわかります。
すべての既知の実装クラス:
AbstractMap.SimpleEntry、AbstractMap.SimpleImmutableEntry
クラスAbstractMap.SimpleEntryは、2つのコンストラクターを提供します。
コンストラクターと説明
AbstractMap.SimpleEntry(K key、V value)
指定されたキーから指定された値へのマッピングを表すエントリを作成し
ます。
AbstractMap.SimpleEntry(Map.Entry <?extends K、?extends V> entry)
指定されたエントリと同じマッピングを表すエントリを作成します。
ユースケースの例:
import java.util.Map;
import java.util.AbstractMap.SimpleEntry;
public class MyClass {
public static void main(String args[]) {
Map.Entry e = new SimpleEntry<String, String>("Hello","World");
System.out.println(e.getKey()+" "+e.getValue());
}
}
なぜMap.Entry
ですか?キーと値のペアのようなものがこのケースに適していると思います。
java.util.AbstractMap.SimpleImmutableEntry
またはを使用するjava.util.AbstractMap.SimpleEntry
org.apache.commons.lang3.tuple.Pair
を実装java.util.Map.Entry
し、スタンドアロンで使用することもできます。
また、他の人が言及したように、Guava'scom.google.common.collect.Maps.immutableEntry(K, V)
がそのトリックを行います。
Pair
私はその流暢なPair.of(L, R)
構文が好きです。
いつも使用している汎用の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))