2010-11-29 7 views
0

"User1", "43"과 같은 항목이있는 Map<String,String>이 있습니다. 이제 가장 높은 가치의 "상위 3 위"를 원합니다.Map <String, String>에서 최대 값 3 개 가져 오기

Map<String,Integer>으로는 더 쉬울 것이지만, 기술적 인 한계로 인해지도를 <String,String>으로 붙잡을 수 있습니다.

<String,String>지도를 <String,Int>으로 변환하고 정렬하는 가장 효율적인 방법은 무엇입니까?

답변

0

Map의 값 (Map.values ​​())을 반복하면서 각각 Integer.getInteger (String s)를 사용하여 정수로 변환하고 표시되는 상위 3 개를 추적 할 수 있습니다.

위의 방법과 같이 할 수 있지만 상위 3 개를 추적하는 대신 LinkedList를 만들고 각 정수를 올바른 위치에 삽입합니다 (Integer를 삽입해야하는 위치를 찾을 때까지 LinkedList를 트래버스합니다).

1

몇 가지 방법이 있습니다

  1. 는, 예를 들어, SortedMap를 만들기 TreeMap은 compare() 메소드 호출에서 얻은 키를 검색하여 비교를 수행하는 사용자 정의 - 익명 - 비교자를 사용하여 원래 맵의 값과 비교합니다.
  2. addAll() 메소드를 통해 원본의 모든 키/값 항목으로 채 웁니다.
  3. 지도가 가치순으로 정렬됩니다.
  4. 채우기 ...

    1. 위와 같이 정의 비교와 키의 TreeSet의 생성 :
    2. 잡아 머리/꼬리

    유사 위 (당신의 비교기 정렬 방법에 따라 다름) 원래지도의 keySet()을 사용하십시오.

  5. 키의 헤드/테일 세트를 가져옵니다. 그러나

    Map<String, Integer> treemap = new HashMap<String, Integer>(); 
    for (Entry<String, String> entry : entries) { 
        treemap.put(entry.getKey(), Integer.parseInt(entry.getValue())); 
    } 
    

    을, 당신은 반복해야합니다 :

3

는 사용할 수 <String, Integer><String, String>에서 변환하려면 ... 원래지도에서 해당 키와 값에서 새지도 만들기 다시지도. 전체지도가 필요하지 않고 상위 3 개가 필요한 경우 항목을 반복하고 비교하여 상위 3 개를 얻을 수 있습니다.

또는 상단 요소와 전체 데이터가 모두 필요한 경우 TreeMap<Integer, String>Comparator으로 바꾸거나 키와 값을 반대로 할 수 있습니다.

1

당신은 목록에있는 값을 넣어 그것을 정렬 할 수 있습니다 :

ArrayList<Integer> highest = new ArrayList<Integer>(); 
for (String value : map.values()) { 
    highest.add(Integer.parseInt(value)); 
} 
Collections.sort(highest); 
for(int i = highest.size() - 1; i >=0 && i > highest.size()-4; i--){ 
    System.out.println(highest.get(i)); 
} 

을지도 그것을 반복 만 전체 목록을 정렬없이 3 개 가장 높은 값을 선택하는 것이 좋습니다 수 있습니다 매우 큰 경우 .

관련 문제