web-dev-qa-db-ja.com

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

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

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

それから私はこのように記入します。

team1.put("United", 5);

キーを入手するにはどうすればいいですか。 "United"を返すteam1.getKey()のようなものです。

138
masb

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"を表示します。

275
Matteo

これは、少なくとも理論的には可能です、あなたがインデックスを知っているなら:

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

keySet()は集合を返すので、その集合を配列に変換します。

もちろん問題は、セットがあなたの注文を守ることを約束していないということです。 HashMapにアイテムが1つしかない場合は問題ありませんが、それ以上のものがある場合は、他の回答と同じようにマップをループすることをお勧めします。

44
james.garriss

これをチェックして。

https://docs.Oracle.com/javase/8/docs/api/Java/util/HashMap.html

(HashMapはnullを含むことができるのでJava.util.Objects.equalsを使用してください)

JDK 8+を使用する

/**
 * 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());
}

JDK 7を使用している場合.

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;
}
23
Fabio F.

Method keySet() を使用して、すべてのMapのキーを取得できます。さて、あなたが必要なものがそのを与えられたキーを得ることであれば、それは全く別の問題であり、Mapは役に立ちません。そこのあなた; Apacheの Commons CollectionsBidiMap (キーと値の間の双方向ルックアップを可能にするマップ)のような特別なデータ構造が必要です。複数の異なるキーが同じ値にマッピングされる可能性があることに注意してください。

6
Óscar López
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());
                }
2
sachin

単純なものが必要で、さらに検証が必要な場合は.

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

その後、任意のキーを検索できます。

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

値が与えられている(5)引数(United)を取得したいのであれば、双方向マップ(例:Guava: http://docs.guava-librariesを使用すること)を検討することもできます。 googlecode.com/git/javadoc/com/google/common/collect/BiMap.html )。

1

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

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

    return keys[pos];
}
0
Orici