354

Util.Map.Entry同様に構造を含むkey新しいアイテムを作成したいと思いますvalue

Map.Entry問題は、それがインターフェースであるため、インスタンス化できないことです。

Map.Entryの新しい汎用キー/値オブジェクトを作成する方法を知っている人はいますか?

4

11 に答える 11

922

あり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バージョンには、使用できる既知の実装クラスがリストされていないため、独自の実装クラスで立ち往生している可能性があります。

于 2010-06-24T13:52:59.090 に答える
149

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, ...)

于 2018-09-20T13:51:22.930 に答える
82

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());
于 2010-06-24T14:01:20.683 に答える
56

GuavaのMaps.immutableEntryをお試しください

これには、Java 5と互換性があるという利点があります(AbstractMap.SimpleEntryJava 6が必要な場合とは異なります)。

于 2010-06-24T13:53:09.767 に答える
36

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

グラフ構造のエッジを定義するのに適しています。あなたの頭の中のニューロンの間のもののように。

于 2015-09-26T22:46:58.457 に答える
20

あなたは実際に行くことができます: Map.Entry<String, String> en= Maps.immutableEntry(key, value);

于 2018-11-07T21:54:57.303 に答える
15

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());
    }
}
于 2020-09-06T10:32:41.793 に答える
13

なぜMap.Entryですか?キーと値のペアのようなものがこのケースに適していると思います。

java.util.AbstractMap.SimpleImmutableEntryまたはを使用するjava.util.AbstractMap.SimpleEntry

于 2013-11-26T07:19:51.673 に答える
9

org.apache.commons.lang3.tuple.Pairを実装java.util.Map.Entryし、スタンドアロンで使用することもできます。

また、他の人が言及したように、Guava'scom.google.common.collect.Maps.immutableEntry(K, V)がそのトリックを行います。

Pair私はその流暢なPair.of(L, R)構文が好きです。

于 2012-11-18T23:11:24.170 に答える
4

いつも使用している汎用の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);
    }

}
于 2010-06-24T14:06:44.730 に答える
3

Clojureを使用している場合は、別のオプションがあります。

(defn map-entry
  [k v]
  (clojure.lang.MapEntry/create k v))
于 2016-07-19T16:44:16.750 に答える