JavaのHashMapからキーを取得する


167

私はこのようにJavaでハッシュマップを持っています:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

次に、次のように入力します。

team1.put("United", 5);

どうすればキーを入手できますか?のようなもの:team1.getKey()「ユナイテッド」を返す。


team1.getKey()(1)マップが空である、または(2)マップに複数のキーが含まれている場合、何を返すと思いますか?
NPE

intこのような単一のものに使用する必要があります。
stommestack 2014年

回答:


313

AにHashMapは複数のキーが含まれています。を使用keySet()して、すべてのキーのセットを取得できます。

team1.put("foo", 1);
team1.put("bar", 2);

1キー"foo"とキーで保存され2ます"bar"。すべてのキーを反復するには:

for ( String key : team1.keySet() ) {
    System.out.println( key );
}

印刷"foo""bar"ます。


しかし、この場合、各値に対して1つのキーしかありません。team1.getKey()のようなものを書くことはできませんか?
masb

要素が1つのマップはありません。しかし、それはマップです。複数の要素を含むことができる構造です。
Matteo、

13
単一のキーを持つマップのポイントは何ですか?キーフィールドと値フィールドを持つクラスを作成します。
JB

私は自分の問題を誤解しました。ご回答ありがとうございます。
masb

3
すべてのキーを配列リストに保存する場合:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani

50

インデックスを知っていれば、これは少なくとも理論的には実行可能です。

System.out.println(team1.keySet().toArray()[0]);

keySet() セットを返すため、セットを配列に変換します。

もちろん問題は、セットが注文を維持することを約束しないことです。HashMapに項目が1つしかない場合は問題ありませんが、それ以上の場合は、他の回答と同様に、マップをループ処理することをお勧めします。


これは、のコンテンツを完全に制御できる単体テストシナリオで役立ちますHashMap。良いショー。
risingTide 2018年

問題のインデックスを知ることについては何もありません。
ローン侯爵

23

これをチェックして。

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

java.util.Objects.equalsHashMapにはを含めることができるため使用null

JDK8 +の使用

/**
 * Find any key matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return Any key matching the value in the team.
 */
private Optional<String> getKey(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .findAny();
}

/**
 * Find all keys matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return all keys matching the value in the team.
 */
private List<String> getKeys(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
}

より「一般的」で、可能な限り安全

/**
 * Find any key matching the value, in the given map.
 *
 * @param mapOrNull Any map, null is considered a valid value.
 * @param value     The value to be searched.
 * @param <K>       Type of the key.
 * @param <T>       Type of the value.
 * @return An optional containing a key, if found.
 */
public static <K, T> Optional<K> getKey(Map<K, T> mapOrNull, T value) {
    return Optional.ofNullable(mapOrNull).flatMap(map -> map.entrySet()
            .stream()
            .filter(e -> Objects.equals(e.getValue(), value))
            .map(Map.Entry::getKey)
            .findAny());
}

または、JDK7を使用している場合。

private String getKey(Integer value){
    for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
            return key; //return the first found
        }
    }
    return null;
}

private List<String> getKeys(Integer value){
   List<String> keys = new ArrayList<String>();
   for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
             keys.add(key);
      }
   }
   return keys;
}

2
しかし、複数のキーが同じ値にマッピングされている場合はどうなりますか?あなたの代わりにキーのリストを返すべきである
オスカル・ロペスを

@ÓscarLópez彼らはできません。HashMapキーは一意です。
ローンの侯爵

6

Mapメソッドを使用して、のすべてのキーを取得できますkeySet()。さて、必要なものがその値を与えられたキーを取得することである場合、それはまったく別の問題でMapあり、そこでは役立ちません。BidiMapApacheのCommons Collectionの(キーと値の間の双方向ルックアップを可能にするマップ)のような特殊なデータ構造が必要です-また、いくつかの異なるキーが同じ値にマップされる可能性があることに注意してください。



1

単純なものだけでなく、さらに検証が必要な場合。

public String getKey(String key)
{
    if(map.containsKey(key)
    {
        return key;
    }
    return null;
}

次に、任意のキーを検索できます。

System.out.println( "Does this key exist? : " + getKey("United") );

1
この方法は完全に冗長です。
ローン侯爵

1
private Map<String, Integer> _map= new HashMap<String, Integer>();
Iterator<Map.Entry<String,Integer>> itr=  _map.entrySet().iterator();
                //please check 
                while(itr.hasNext())
                {
                    System.out.println("key of : "+itr.next().getKey()+" value of      Map"+itr.next().getValue());
                }

動作しません。明らかにあなたはそれを試していません。next()ループで2回呼び出すと、奇数番号のキーと偶数番号の値が出力されます。
ローン侯爵

0

より高速な反復のために関数演算を使用します。

team1.keySet().forEach((key) -> { System.out.println(key); });


-1

解決策は、キーの位置がわかっている場合、キーを文字列配列に変換し、その位置に値を返すことです。

public String getKey(int pos, Map map) {
    String[] keys = (String[]) map.keySet().toArray(new String[0]);

    return keys[pos];
}

問題のインデックスを知ることについては何もありません。
ローン侯爵

-2

次の簡単なプログラムを試してください:

public class HashMapGetKey {

public static void main(String args[]) {

      // create hash map

       HashMap map = new HashMap();

      // populate hash map

      map.put(1, "one");
      map.put(2, "two");
      map.put(3, "three");
      map.put(4, "four");

      // get keyset value from map

Set keyset=map.keySet();

      // check key set values

      System.out.println("Key set values are: " + keyset);
   }    
}

-2
public class MyHashMapKeys {

    public static void main(String a[]){
        HashMap<String, String> hm = new HashMap<String, String>();
        //add key-value pair to hashmap
        hm.put("first", "FIRST INSERTED");
        hm.put("second", "SECOND INSERTED");
        hm.put("third","THIRD INSERTED");
        System.out.println(hm);
        Set<String> keys = hm.keySet();
        for(String key: keys){
            System.out.println(key);
        }
    }
}

既存の回答を単にコピーします。-1
james.garriss 2015年

-2

HashMapでキーを取得するには、java.util.Hashmapパッケージに存在するkeySet()メソッドを使用します。例:

Map<String,String> map = new Hashmap<String,String>();
map.put("key1","value1");
map.put("key2","value2");

// Now to get keys we can use keySet() on map object
Set<String> keys = map.keySet();

これで、キーはすべてのキーをマップで使用できるようになります。例:[key1、key2]


java,util.HashMapパッケージではなくクラスであり、5年前にはここになかったものはここにはありません。
ローン侯爵

-3

非常に単純ですがメモリを浪費するのは、キーを使用して値をマップし、反対の方法で値をキーにマップして、次のようにします。

private Map<Object, Object> team1 = new HashMap<Object, Object>();

このように<Object, Object>マップkeys:ValueしてValue:Keys好きになるためには、使用することが重要です

team1.put("United", 5);

team1.put(5, "United");

したがって、使用する team1.get("United") = 5team1.get(5) = "United"

しかし、ペアのオブジェクトの1つで特定のメソッドを使用する場合は、別のマップを作成した方がよいでしょう。

private Map<String, Integer> team1 = new HashMap<String, Integer>();

private Map<Integer, String> team1Keys = new HashMap<Integer, String>();

その後

team1.put("United", 5);

team1Keys.put(5, "United");

そして、覚えておいてください、それをシンプルにしてください;)


-3

キーとそのを取得するには

例えば

private Map<String, Integer> team1 = new HashMap<String, Integer>();
  team1.put("United", 5);
  team1.put("Barcelona", 6);
    for (String key:team1.keySet()){
                     System.out.println("Key:" + key +" Value:" + team1.get(key)+" Count:"+Collections.frequency(team1, key));// Get Key and value and count
                }

印刷されます:キー:United Value:5キー:Barcelona Value:6

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