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 2014 년

아니오, 순서는 실행마다 보장되지 않지만 동일한 스레드 내에서 순서를 신뢰할 수 있습니다.
hd1 2014-10-07

1
@JonSkeet 사실 이것은 정말 유효한 질문입니다. Groovy에서는 맵 목록처럼 보이는 구조를 되 찾는 경우가 많습니다. 각 맵에는 단일 항목이 있습니다. 지금까지 모든 값을 인쇄하는 쉽고 분명한 (Groovy) 방법을 찾지 못했습니다. 키가 상수이면 collection.each {println it.key}만큼 쉽게 각 값을 출력 할 수 있지만 상수 키가 없으면 명확하지 않지만 collection.each {println it.values ​​() [0]} 작동합니다 ( 여기에 몇 가지 답변에 대한 개선 ...).
Bill K

@BillK : 각지도에 정확히 하나의 항목이 있다는 것을 알고 있다면 실제로는 다른 질문이며 더 의미있는 질문입니다.
Jon Skeet

답변:


250

이것을 시도 할 수 있습니다.

 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주문을 그대로 유지 하려면 a 를 사용하십시오 .

예 :

 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올바른 위치에 대신 언급 한 내 수업 ... 온라인 에서 답변을 찾을 수 없습니다 ..help
Blue Bot

@darthydarth 컨텍스트에 따라 적절한 유형을 사용해야합니다.
Ruchira Gayan Ranaweera 2011

답변 해 주셔서 감사합니다! 예상하지 못했습니다 ... 둘째로 런타임에 저장되지 않은 Generics에 문제가 있음을 발견했습니다. 결국 나는 Gson값 객체를 a로 변환 String하고 내 클래스 유형으로 다시 구문 분석하는 데 사용하여 해킹했습니다 . 추악하지만 다른 언어로 쉽게 수행 할 수있는 다른 솔루션을 찾을 수 없었습니다 (지금 Java를 사용합니다)
Blue Bot

하지만 어떻게? 코멘트 섹션에 너무 많이
Blue Bot

@darthydarth 당신은 나에게 이메일을 보낼 수 있습니다. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera 2011

65

"첫 번째"값을 얻으려면 :

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

"첫 번째"키의 값을 얻으려면 :

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

참고 : 위 코드는 테스트를 거쳐 작동합니다.

HashMap 항목이 정렬되지 않았기 때문에 "처음"이라고 말합니다.

그러나 LinkedHashMap은 삽입 된 순서대로 항목을 반복합니다. 삽입 순서가 중요한 경우 맵 구현에 사용할 수 있습니다.


먼저지도가 비어 있지 않은지 확인해야합니다
ACV

48

자바 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();

또한, 당신이 무엇을하는지 알고 있고 맵의 두 번째 항목 (세 번째 항목과 동일)을 얻고 싶다면 이것을 시도해야합니다.

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가 의도 한 것이 아니기 때문입니다. ( 이 게시물 에서 odered 및 sorter 컬렉션에 대해 자세히 읽을 수 있습니다 ).

게시물로 돌아가서 첫 번째 요소 키를로드하여 이미 절반의 작업을 수행했습니다.

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쌍 을 가지고 있습니다 . 즉, 각 맵에는 하나의 키와 하나의 값이 있습니다. 이러한 경우 이러한 쌍의 첫 번째 키를 빠르게 찾는 것이 편리합니다.


0

또한 이것을하는 좋은 방법 :)

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

-2

아래에서 시도해 볼 수도 있습니다.

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);

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