[java] 반복하지 않고 해시 맵에서 하나의 항목을 얻는 방법

Entry<K,V>키를 알 수없는 경우 반복하지 않고 HashMap에서 하나만 얻는 우아한 방법이 있습니까?

입국 순서는 중요하지 않으므로 다음과 같이 말할 수 있습니다.

hashMapObject.get(zeroth_index);

인덱스 방법에 의한 get이 없다는 것을 알고 있지만.

아래에 언급 된 접근 방식을 시도해도 여전히 hashmap의 모든 항목 세트를 가져와야 합니다.

for(Map.Entry<String, String> entry : MapObj.entrySet()) {
    return entry;
}

제안은 환영합니다.

편집 : 요구 사항을 충족시키기 위해 다른 데이터 구조를 제안하십시오.



답변

Jesper의 답변이 좋습니다. 다른 솔루션은 TreeMap을 사용하는 것입니다 (다른 데이터 구조를 요청한 경우).

TreeMap<String, String> myMap = new TreeMap<String, String>();
String first = myMap.firstEntry().getValue();
String firstOther = myMap.get(myMap.firstKey());

TreeMap에는 오버 헤드가 있으므로 HashMap이 더 빠르지 만 대안 솔루션의 예와 같습니다.


답변

지도는 순서가 정해져 있지 않으므로 ‘첫 번째 항목’과 같은 항목이 없으므로 Map(또는 HashMap) 에 색인으로 가져 오기 방법이없는 이유도 있습니다 .

당신은 이것을 할 수 있습니다 :

Map<String, String> map = ...;  // wherever you get this from

// Get the first entry that the iterator returns
Map.Entry<String, String> entry = map.entrySet().iterator().next();

(참고 : 빈지도 확인 생략).

코드는 맵의 모든 항목을 가져 오지 않으며 발견 된 첫 번째 항목과 함께 즉시 리턴 (루프에서 나옴)합니다.

이 첫 번째 요소의 키와 값을 인쇄하려면

System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue());

참고 : 전화 iterator()한다고해서 전체지도를 반복한다는 의미는 아닙니다.


답변

반복자가 가장 간단한 해결책 일 수 있습니다.

return hashMapObject.entrySet().iterator().next();

또 다른 해결책 (예쁘지 않음) :

return new ArrayList(hashMapObject.entrySet()).get(0);

또는 아직 (더 좋지 않음) :

return hashMapObject.entrySet().toArray()[0];


답변

값을 가져 와서 배열로 변환하고 배열의 첫 번째 요소를 가져옵니다.

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

W.


답변

왜 전화하지 않으려 할 entrySet()않습니다 그것을 하지 일반적으로 자신의 상황과 완전히 새로운 개체를 만들 수 있지만 대신 외관 객체를 제공합니다. 간단히 말해서 entrySet()꽤 저렴한 작업입니다.


답변

Java 8을 사용하는 경우 findFirst () 만큼 간단합니다 .

빠른 예 :

Optional<Car> theCarFoundOpt = carMap.values().stream().findFirst();

if(theCarFoundOpt.isPresent()) {
    return theCarFoundOpt.get().startEngine();
}


답변

제안한 API를 정말로 원한다면 HashMap을 서브 클래 싱하고 목록에서 키를 추적 할 수 있습니다. 이 점을 실제로 보지는 않지만 원하는 것을 제공합니다. 의도 된 사용 사례를 설명하면 더 나은 솔루션을 얻을 수 있습니다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SuppressWarnings("unchecked")
public class IndexedMap extends HashMap {

    private List<Object> keyIndex;

    public IndexedMap() {
        keyIndex = new ArrayList<Object>();
    }

    /**
     * Returns the key at the specified position in this Map's keyIndex.
     *
     * @param index
     *            index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException
     *             if the index is out of range (index < 0 || index >= size())
     */
    public Object get(int index) {
        return keyIndex.get(index);
    }

    @Override
    public Object put(Object key, Object value) {

        addKeyToIndex(key);
        return super.put(key, value);
    }

    @Override
    public void putAll(Map source) {

        for (Object key : source.keySet()) {
            addKeyToIndex(key);
        }
        super.putAll(source);
    }

    private void addKeyToIndex(Object key) {

        if (!keyIndex.contains(key)) {
            keyIndex.add(key);
        }
    }

    @Override
    public Object remove(Object key) {

        keyIndex.remove(key);
        return super.remove(key);
    }
}

편집 : 나는 의도적으로 이것의 제네릭 측면을 탐구하지 않았습니다 …