2012-02-28 4 views
2

에 216 개의 항목이 들어 있다고 가정하면 LinkedHashMap<Integer, Object>에서 처음으로 100 개의 값 (여기에는 Object)을 어떻게 얻을 수 있습니까?HashMap 또는 LinkedHashMap에서 제한된 수의 값을 가져 오는 방법은 무엇입니까?

+0

당신이 (당신의 질문/제목처럼) 값을 원하거나 기록 마십시오 (영업의 의견에 따라) (키 : 귀하의 진술과 같은 값 쌍)? – haylem

+0

values ​​() 객체로! –

+0

좋아, 그렇게 생각해. 고마워, 내 대답 (또는 다른 사람)을 참조하십시오. 나는 당신의 질문을 명확하게하기 위해 약간 썼다. – haylem

답변

2

미운 한 줄

추한 할 (그리고 질문의 경우에 ArrayList<Object>을 반환) 할 한 줄 :

Collections.list(Collections.enumeration(lhMap.values())).subList(0, 100) 

이뿐만 아니라 HashMap을 위해 일 것 그러나 HashMapHashSet으로 뒷받침됩니다. 입력 한 처음 100 개의 값을 얻을 수 있다고 보장 할 수는 없습니다. 비슷한 제한이있는 다른 유형에서도 작동합니다.

주 :

  • 상대적으로 unefficient (! 알고 Javadoc을 읽어 이유 - 더있을지라도),
  • 주의, (더 알기 위해 자바 독을 읽기)보기를 사용
  • I 그것이 추한 것을 언급했다.

단계적인 사용 예

Map<Integer, Pair<Double, SelectedRoad>> hashmap3 = 
    new LinkedHashMap<Integer, Pair<Double, SelectedRoad>>(); 

// [...] add 216 elements to hasmap3 here somehow 

ArrayList<Pair<Double,SelectedRoad>> firstPairs = 
    Collections.list(Collections.enumeration(hashmap3.values())).subList(0, 100) 

// you can then view your Pairs' SelectedRow values with them with: 
// (assuming that: 
// - your Pair class comes from Apache Commons Lang 3.0 
// - your SelectedRoad class implements a decent toString()) 
for (final Pair<Double, SelectedRoad> p : firstPairs) { 
    System.out.println("double: " + p.left); 
    System.out.println("road : " + p.right); 
} 
+0

Map > hashmap3 = 새 LinkedHashMap <정수, 쌍 >(); 이제는 100 줄 만 있으면됩니다. 코드를 작성하십시오. 감사! –

+0

'Pair '를 위의 코드 샘플에서'Object'로 대체하십시오. 당신은 100 요소의'List >'를 얻을 것이다. – haylem

+0

@AdnanAliCh : 수정 된 답변 참조. – haylem

-1

카운터를 사용할 수 있습니다. 카운터가 100에 도달하면 foreach 루프가 종료됩니다.

-2

Iterator.next()을 100 번 사용하는 루프를 작성한 다음 중지합니다.

나는 NavigableMapSortedMap에 대해 말하려고했으나 인터페이스는 키가 아니라 인덱스로 정의되었습니다. 그럼에도 불구하고 실제로 근본적인 문제가 무엇인지에 따라 유용 할 수 있습니다.

5

제목이 HashMap 인 경우 시작하는 것이 좋습니다. 그다지 의미가 없습니다. HashMap에는 특별한 순서가 없으며 호출간에 순서가 변경 될 수 있습니다. 그것은 LinkedHashMap에 대한 더 이해가됩니다.

Iterable<Object> first100Values = Iterables.limit(map.values(), 100); 

또는

// Or whatever type you're interested in... 
Iterable<Map.Entry<Integer, Object>> firstEntries = 
    Iterables.limit(map.entrySet(), 100); 

당신은 그에서 목록을 만들거나 반복 할 수 있습니다, 또는 당신이 원하는 무엇이든 :이

, 나는 GuavaIterables.limit 방법을 사용하십시오 해야 할 것.

+0

+1 구아바에 대해, 나는 그 하나를 곧바로 생각했다. 그러나 나는 그것이 웬일인지, 여기에서 원하지 않는다고 생각했다. 무한한 선보다 훨씬 더 좋은 방법으로 무한히 나아질 것입니다. – haylem

3

당신은 할 수 있습니다 :

Map<Integer, Object> records; 
List<Entry<Integer, Object>> firstHundredRecords 
    = new ArrayList<Entry<Integer, Object>>(records.entrySet()).subList(0, 100); 

이지도에서 모든 항목을 복사 않습니다하지만.

+1

100 개의 객체 참조를 복사하는 것은 그렇게 비싸지 않습니다. 그것처럼. –

+0

실제로 216 개의 참조를 복사합니다. 그러나 여전히 비싼 것은 아닙니다. –

+0

Ah - yes - 전체 목록을받은 하위 목록이 새 목록에서 호출됩니다. TooManyBracketsConfusionError;) –

2

라이브러리를 사용하여 필요한 레코드 만 복사하십시오.

Map<Integer, Object> records; 

List<Entry<Integer, Object>> firstHundredRecords = new ArrayList<>(); 
for(Entry<Integer, Object> entry : records.entrySet()) { 
    firstHundredRecords.add(entry); 
    if (firstHundredRecords.size()>=100) break; 
} 
+0

감사합니다. 정말 좋은 솔루션입니다! –

+0

> hashmap3 = 새 LinkedHashMap <정수, 쌍 >(); List > firstHundredRecords = 새 ArrayList <>(); for (Entry 항목 : hashmap3.entrySet()) { firstHundredRecords.add (입력); if (firstHundredRecords.size()> = 100) break; } 하지만 Map >에 적합하지 않습니다. hashmap3 = 새 LinkedHashMap >(); –

+0

'Map > entry'가 있어야합니다. IDE가 자동으로이 문제를 해결할 수 있어야합니다. (항목 <정수, 쌍 <더블, SelectedRoad >> 항목 : hashmap3.entrySet())이 반환됩니다 –

관련 문제