Java의 HashMap에서 키 가져 오기


166

다음과 같은 Java 해시 맵이 있습니다.

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

그런 다음 다음과 같이 채 웁니다.

team1.put("United", 5);

열쇠는 어떻게 줍니까? 같은 뭔가 : team1.getKey()"미국"을 반환합니다.


team1.getKey()(1)지도가 비어 있거나 (2) 여러 키가 포함 된 경우 무엇 을 반환해야합니까?
NPE

int이 같은 단일에 사용해야합니다.
stommestack

답변:


312

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".


그러나이 경우 각 값에 대해 하나의 키 만 있습니다. team1.getKey ()와 같은 것을 작성할 수 없습니까?
masb

아니요 요소가 하나 인지도가 없습니다. 그러나 그것은지도입니다 : 하나 이상의 요소를 포함 할 수있는 구조.
Matteo

13
하나의 키를 가진지도의 요점은 무엇입니까? 키 필드와 값 필드로 클래스를 작성하십시오.
JB 니 제트

나는 내 문제를 오해했다. 답변 주셔서 감사합니다.
masb

3
당신은 배열 목록에있는 모든 키를 저장하려면 :List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani에게

50

인덱스를 알고 있다면 이론 상으로는 가능 합니다.

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

keySet() 집합을 반환하므로 집합을 배열로 변환합니다.

물론 문제는 세트가 주문을 유지할 것을 약속하지 않는다는 것입니다. HashMap에 하나의 항목 만 있으면 좋을 것입니다.하지만 그보다 많은 경우 다른 답변과 마찬가지로 맵을 반복하는 것이 가장 좋습니다.


이는 콘텐츠를 완전히 제어 할 수있는 단위 테스트 시나리오에서 유용합니다 HashMap. 좋은 공연.
risingTide

질문의 색인을 아는 것에 대해서는 아무것도 없습니다.
Lorne의 후작

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키는 고유합니다.
Lorne의 후작

6

Map메소드를 사용하여 모든 키를 검색 할 수 있습니다 keySet(). 만약 당신이 필요로하는 것이 그 가치가 주어진 를 얻는 것이라면 , 그것은 완전히 다른 문제이며 당신을 도울 수 없습니다. Apache의 Commons Collections 에서 (키와 값 사이의 양방향 조회를 허용하는 맵) 과 같은 특수한 데이터 구조가 필요합니다. 또한 여러 다른 키가 동일한 값에 맵핑 될 수 있다는 점에 유의하십시오.MapBidiMap



1

간단하고 검증이 필요한 것이 있다면.

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

그런 다음 아무 키나 검색 할 수 있습니다.

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

1
이 방법은 완전히 중복됩니다.
Lorne의 후작

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()루프에서 두 번 호출 하면 홀수 번호 키와 짝수 번호 값이 인쇄됩니다.
Lorne의 후작

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];
}

질문의 색인을 아는 것에 대해서는 아무것도 없습니다.
Lorne의 후작

-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

-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 년 전에는 없었던 것이 없습니다.
Lorne의 후작

-3

내가 할 일은 매우 간단하지만 메모리를 낭비하는 것은 값을 키로 매핑하고 oposite를 수행하여 키를 값으로 매핑하는 것입니다.

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"

그러나 쌍으로 된 객체 중 하나에 특정 방법을 사용하면 다른지도를 작성하는 것이 좋습니다.

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
                }

인쇄 : 키 : 유나이티드 가치 : 5 키 : 바르셀로나 가치 : 6

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.