2013-06-13 2 views
9

그래서 Java에 매우 익숙하며 연습을 통해 자신의 파이썬 프로그램 중 하나를 Java로 변환하고 있습니다.Java HashMap에서 값을 기준으로 상위 10 개 항목을 반환하는 방법

나는 다음은 (값으로) 분류 만이 키를 반환합니다 파이썬에서 나는 동작을 복제하려고 문제로되지 값을 실행 한 : 자바에서

popular_numbers = sorted(number_dict, key = number_dict.get, reverse = True) 

, 내가 가진를 약간의 연구를 수행하고 자신이나 비슷한 방법과 같은 n00b에 대한 쉬운 샘플을 아직 찾지 못했습니다. 정렬을 위해 Guava를 사용하는 예제를 찾았지만 정렬은 키별로 정렬 된 HashMap을 반환합니다.

위와 이외에도 Java에서 발견되지 않은 파이썬에 관한 다른 좋은 점 중 하나는 정렬 된 값의 하위 집합을 쉽게 반환 할 수 있다는 것입니다. 파이썬에서 단순히 다음을 수행 할 수 있습니다 :이 예에서

print "Top 10 Numbers: %s" % popular_numbers[:10] 

, number_dict 키의 사전이며, 값 쌍은 키 번호 1..100를 나타냅니다 및 값 횟수입니다 수 (키) 발생

10 번호 :

for n in numbers: 
if not n == '': 
    number_dict[n] += 1 

최종 결과는 같은 것, [ '27', '11', '5', '8', '16', '25 ','1 ','24 ','32 ', '20 ']

Java에서 명확하게 HashMap을 만들었으므로 성공적으로 숫자를 검사하고 키, 값 쌍의 값을 증가 시켰습니다. 나는 이제 정렬에 집착하고 값에 따라 상위 10 개의 숫자 (키)를 반환합니다. 지도를 가정

+3

특히 HashMap을 사용해야하는 이유가 있나요? 특히 정렬이 필요하기 때문에 그렇습니까? – Zong

+0

해시 맵이 아닌 트리 맵 사용에 대해 생각해 보셨습니까? – BlackHatSamurai

+0

가능한 중복 : http://stackoverflow.com/questions/780541/how-to-sort-hash-map, http://stackoverflow.com/questions/8119366/sorting-hashmap-by-values ​​ – BlackHatSamurai

답변

0

이 같은 것을 정의하고 을 기준으로 정렬 할 것인지 : 지금

HashMap<Integer, Integer> map= new HashMap<Integer, Integer>(); 
//add values 
Collection<Integer> values= map.values(); 
ArrayList<Integer> list= new ArrayList<Integer>(values); 
Collections.sort(list); 

, 목록의 첫 번째 상위 10 개 요소를 인쇄 할 수 있습니다. HashMap은 (는 키의 해시 코드에 따라 버킷의 값을 저장) 모두에서 분류되지 않기 때문에

for (int i=0; i<10; i++) { 
    System.out.println(list.get(i)); 
} 

지도의 값은 실제로 정렬되지 않습니다. 이 코드는지도에 10 개의 가장 작은 요소 만 표시합니다. 키 - 값 쌍을 잃지 않고

편집 종류 :

이제
//sorted tree map 
TreeMap<Integer, Integer> tree= new TreeMap<>(); 

//iterate over a map 
Iteartor<Integer> it= map.keySet().iterator(); 
while (it.hasNext()) { 
    Integer key= it.next(); 
    tree.put(map.get(key), key); 
} 

당신이 손실되지 않도록 당신이 분류되고 원래의 맵에서 키 - 값 쌍을 반전 한 TreeMap 나무가 정보.

+0

이제 키 - 값 쌍이 손실되었습니다. – NullUserException

+0

이 값으로 정렬하지만 참조한 키를 쉽게 찾을 수 없습니다 ... – chessbot

+0

예 바인딩이 손실되지만 가능합니다. 첫 번째 상위 10 개 요소 만 필요합니다. – AnarchoEnte

10
  1. 지도의 entrySet()List에 넣습니다.
  2. Collections.sortComparator을 사용하여이 목록을 정렬하면 해당 값에 따라 Entry이 정렬됩니다.
  3. 방법을 List으로 사용하면 상위 10 개 요소가 포함 된 새 목록을 검색 할 수 있습니다.

네,

+0

그래,이게 갈 길이야. 그렇다면 'HashMap'을 사용하는 이유는 무엇입니까? 특히 결과가 * value *로 정렬되는 경우? 나는 OP가 무엇을하고 있는지 모른다 ... – Zong

0

다음보십시오 : 파이썬보다 훨씬 더 자세한 될 것입니다 :

public static void main(String[] args) { 

    // Map for store the numbers 
    Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 

    // Populate the map ... 

    // Sort by the more popular number 
    Set<Entry<Integer, Integer>> set = map.entrySet(); 
    List<Entry<Integer, Integer>> list = new ArrayList<>(set); 
    Collections.sort(list, new Comparator<Entry<Integer, Integer>>() { 
     @Override 
     public int compare(Entry<Integer, Integer> a, 
       Entry<Integer, Integer> b) { 
      return b.getValue() - a.getValue(); 
     } 
    }); 


    // Output the top 10 numbers 
    for (int i = 0; i < 10 && i < list.size(); i++) { 
     System.out.println(list.get(i)); 
    } 

} 
+0

비교에서'b.getValue(). compareTo (a.getValue())'를 사용하는 것이 더 낫다. OP의 예는 정수를 사용하지만 부동 소수점을 넣기로 결정한 경우 형식을 변경하면이 코드가 손상됩니다. – Zong

+0

'value'는 숫자의 ** 인기 **입니다 (숫자가 떠있을 수 있음). 즉 ** 주파수 **입니다. –

+0

좋아,이 경우 정수로만 표시됩니다. 그러나 나는 여전히 내 제안에 충실 할 것입니다. – Zong

0

구아바 Multiset이 사용 사례에 대한 좋은 적합하고, 친절하게 당신의 HashMap을 대체 할 것이다 . 각 요소의 발생 횟수를 계산하는 모음입니다.

Multisets에는 copyHighestCountFirst 메서드가 있습니다.이 메서드는 개수에 따라 순서가 불변 인 Multiset을 반환합니다.

이제 몇 가지 코드 :

Multiset<Integer> counter = HashMultiset.create(); 
//add Integers 
ImmutableMultiset<Integer> sortedCount = Multisets.copyHighestCountFirst(counter); 
//iterate through sortedCount as needed 
0

사용하십시오 SortedMap, values()를 호출합니다. 워드 프로세서는 다음을 나타냅니다

The collection's iterator returns the values in ascending order of the corresponding keys

그래서 한 귀하의 비교가 제대로 기록 된대로 그냥 처음 n

자바 8 이상으로
1

, a의 처음 10 개 요소를 얻을 수 이상 반복 할 수 intergers의 목록 :

list.stream().sorted().limit(10).collect(Collectors.toList()); 

정수지도의 키의 처음 10 개 요소를 효율적으로 활용하려면 다음

관련 문제