HashMap-最初のキー値の取得


128

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

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

最初のキー(つまりアクティブ)を取得するJavaコード

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

最初のキー「値」(つまり33)をどのように収集できますか。「キー」と「値」の両方を別々の変数に格納したいと思います。


9
HashMapエントリは順序付けされていないため、マップを変更するたびに「最初」が変わる可能性があることに気付きましたか?
NPE

1
に特定の順序がないことを理解していHashMapますか?まったく変更すると、まったく異なる順序で結果が得られる場合があります。
Jon Skeet

いいえ、実行ごとに順序は保証されていませんが、同じスレッド内では順序に依存できます。
hd1 2014年

1
@JonSkeet実際、これは本当に有効な質問です。Groovyでは、マップのリストのように見える構造が返される場合が多く、各マップには1つのエントリーがあります。これまでのところ、すべての値を出力する簡単で明白な(Groovy)方法を見つけていません。キーが定数の場合、collection.each {println it.key}のように各値を出力するのは簡単ですが、定数キーがない場合は明確ではありませんが、collection.each {println it.values()[0]}は機能します(ここでいくつかの回答の改良...)。
Bill K

@BillK:各マップに正確に1つのエントリがあることがわかっている場合、それは実際には別の質問であり、より理にかなった質問です。
Jon Skeet

回答:


249

あなたはこれを試すことができます:

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

ただし、広告HashMap掲載順序は保証されません。a 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

私はこれが非常に古い答えであることを知っています。これは、キーと値を文字列として持つハッシュマップで機能しています。しかし、キャストエラーが発生する値に対してオブジェクトを使用して同じことを試みると、com.google.gson.internal.LinkedTreeMap cannot be cast to...... String正しい場所にではなく、私が述べた私のクラス...オンラインで答えを見つけることができません。ヘルプ
Blue Bot

@darthydarthは、コンテキストに基づいて適切なタイプを使用する必要があります。
Ruchira Gayan Ranaweera

最初に答えてくれて超ありがとう!それを期待していませんでした... 2番目に、実行時に保存されないジェネリックスに問題があることがわかりました。最終的に私はを使用Gsonして値オブジェクトをaに変換しString、それを解析してクラス型に戻すことでハックしました。その醜いですが、他の言語で非常に簡単にできることに対する他の解決策は本当に見つかりませんでした(私は今Javaを使っています)
Blue Bot

確かにどうやって?コメントセクションとしては多すぎる
Blue Bot

@darthydarthあなたは私にメールを送ることができます。ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

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

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

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

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

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

HashMapエントリは順序付けされていないため、「最初」と言います。

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


まず、マップが空でないことを確認する必要があります
ACV

48

Java 8のやり方、

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


キーがある場合は、map.get(firstKey)を使用して最初の値を取得します。ほんのヒントです。:)
UPEN

7

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

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

最初のキー「値」(つまり33)をどのように収集できますか

を使用するとyouMap.get(keyYouHave)、その値を取得できます。

「キー」と「値」の両方を別々の変数に格納したい

はい、それを変数に割り当てることができます。

待って…………終わってない。

あなた(ビジネスロジック)が挿入と取得の順序に依存している場合、奇妙な結果が表示されます。マップは注文されていないため、注文に保存されません。そのことをご承知おきください。代替品を使用して注文を保存してください。たぶんLinkedHashMap


2

ロジックフローはHashMap要素へのアクセスに一定の順序で依存してはならないことに注意してください。単純に言えば、HashMapsは順序付けられたCollectionsではなく、それが目的ではないためです。(この記事では、オデアコレクションとソーターコレクションについて詳しく説明しています)。

投稿に戻ると、最初の要素のキーをロードすることで、仕事の半分をすでに完了しています。

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

呼び出しmap.get(key)て、それぞれの値を取得します。

Object myValue = statusName.get(myKey);

1

一般に、マップでは挿入順序が尊重されないことに注意してください。これを試して :

    /**
     * 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

whoamiの答えを改善する。findFirst()はを返すのでOptional、値があるかどうかを確認することをお勧めします。

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

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

 var key = optional.get();

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


0

これを行うための素晴らしい方法も:)

Map<Integer,JsonObject> requestOutput = getRequestOutput(client,post);
int statusCode = requestOutput.keySet().stream().findFirst().orElseThrow(() -> new RuntimeException("Empty"));

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.