web-dev-qa-db-ja.com

HashMap - First Keyの値を取得する

以下はHashMapに含まれる値です。

statusName {Active=33, Renewals Completed=3, Application=15}

最初のキーを取得するためのJavaコード(すなわちアクティブ)

Object myKey = statusName.keySet().toArray()[0];

どうやって最初のキー "Value"(33)を集めることができますか? "Key"と "Value"の両方を別々の変数に格納したいのです。

87
Prabu

これを試すことができます:

 Map<String,String> map = new HashMap<>();
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key = entry.getKey();
 String value = entry.getValue();

HashMapは挿入順序を保証するものではありません。順序をそのままにするにはLinkedHashMapを使用します。

例えば:

 Map<String,String> map = new LinkedHashMap<>();
 map.put("Active","33");
 map.put("Renewals Completed","3");
 map.put("Application","15");
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key= entry.getKey();
 String value=entry.getValue();
 System.out.println(key);
 System.out.println(value);

出力:

 Active
 33

「最初の」値を取得するには

map.values().toArray()[0]

"first"キーの値を取得するには

map.get(map.keySet().toArray()[0])

注:上記のコードはテスト済みで動作します。

HashMapエントリーは順序付けされていないので、私は "first"と言います。

ただし、LinkedHashMapは、エントリが挿入されたときと同じ順序でエントリを繰り返します。挿入順序が重要な場合は、マップの実装にそれを使用できます。

45
Bohemian

Java 8のやり方、

String firstKey = map.keySet().stream().findFirst().get();

31
whoami

最初のKey "Value"(33)を集めるにはどうすればよいですか

youMap.get(keyYouHave)を使うことで、あなたはそれの価値を得ることができます。

"Key"と "Value"の両方を別々の変数に格納したい

はい、それを変数に代入することができます。

待って.........それは終わっていない。

あなた(ビジネスロジック)が挿入と検索の順序に依存しているなら、あなたは奇妙な結果を見ることになるでしょう。地図は順序付けされていません順序で格納されません。そのことを知っておいてください。あなたの注文を保存するためにいくつかの代替手段を使用してください。おそらく LinkedHashMap

4
Suresh Atta

最初のエントリ全体を取得するためにこれを試すこともできます。

Map.Entry<String, String> entry = map.entrySet().stream().findFirst().get();
String key = entry.getKey();
String value = entry.getValue();

これは最初のエントリーのキーだけを得るために、

String key = map.entrySet().stream().map(Map.Entry::getKey).findFirst().get();
// or better
String key = map.keySet().stream().findFirst().get();

これは最初のエントリの値だけを得るために、

String value = map.entrySet().stream().map(Map.Entry::getValue).findFirst().get();
// or better
String value = map.values().stream().findFirst().get();

さらに、自分が何をしているのかを知っていて、地図の2番目の項目(3番目の項目も同じ)を取得したい場合は、これを試してください。

Map.Entry<String, String> entry = map.entrySet().stream().skip(1).findFirst().get();
String key = map.keySet().stream().skip(1).findFirst().get();
String value = map.values().stream().skip(1).findFirst().get();
4

一般的に言えば、挿入順序はマップ内では尊重されないことを忘れないでください。これを試して :

    /**
     * Get the first element of a map. A map doesn't guarantee the insertion order
     * @param map
     * @param <E>
     * @param <K>
     * @return
     */
    public static <E,K> K getFirstKeyValue(Map<E,K> map){
        K value = null;
        if(map != null && map.size() > 0){
            Map.Entry<E,K> entry =  map.entrySet().iterator().next();
            if(entry != null)
                value = entry.getValue();
        }
        return  value;
    }

私はそれがmap.size() == 1であると確信できるときだけこれを使います。

1
Maxime Claude

HashMapsがHashMapsに順序付けられていないため、ロジックフローがCollection要素へのアクセス順序に依存してはならないことに注意する必要があります。 ( この記事 で、ソートされたコレクションとソーターコレクションについてもっと読むことができます)。

投稿に戻ると、あなたはすでに最初の要素のキーをロードすることによって仕事の半分をしました:

Object myKey = statusName.keySet().toArray()[0];

それぞれの値を取得するためにmap.get(key)を呼び出すだけです。

Object myValue = statusName.get(myKey);
0
tmarwen

Whoamiの回答を改善するfindFirst()Optionalを返すので、値があるかどうかをチェックするのは良い習慣です。

 var optional = pair.keySet().stream().findFirst();

 if (!optional.isPresent()) {
    return;
 }

 var key = optional.get();

また、HashSetの最初のキーを見つけるのは信頼できないとのコメントもありました。しかし時にはHashMapのペアがあります。つまり、各マップには1つのキーと1つの値があります。そのような場合、そのようなペアの最初のキーをすばやく見つけることは便利です。

0
Jan Bodnar