2012-02-07 3 views
0

몇 번이나 물어 보았지만 이해를 돕습니다.지도별로 정렬, 설명이 필요

당신은 값

Map<String, Integer> m = new HashMap<String, Integer>(); 
    m.put("a", 1); 
    m.put("b", 13); 
    m.put("c", 22); 
    m.put("d", 2); 

으로 분류 할 필요지도 당신은 당신이 비교기 클래스

public MapComparator(Map<String, Integer> m) { 
    this.m = m; 
} 

@Override 
public int compare(String a, String b) { 

    int x = m.get(a); 
    int y = m.get(b); 

    if (x > y) 
     return x; 
    if (y > x) 
     return y; 

    return 0; 

} 

이 코드가

public static List<String> sortByValue(final Map<String, Integer> unsortedMap) { 

    List<String> sortedKeys = new ArrayList<String>(); 
    sortedKeys.addAll(unsortedMap.keySet()); 

    Collections.sort(sortedKeys, new MapComparator(unsortedMap)); 

    return sortedKeys; 
} 

을 일어날 수 있도록하는 방법을 호출해야, 분명히 결점이있다. 이유를 이해하도록 도와주세요.

답변

2
if (x > y) 
    return x; 
    if (y > x) 
    return y; 

    return 0; 

당신은 반환해야 1x > y 경우와 -1y > x 경우. Comparator 계약에서는 첫 번째 값이 두 번째 값보다 작 으면 음수를 반환하고 두 번째 값보다 큰 값을 반환하면 양수 값을 반환하도록 지정합니다.

은 (는 의미로 당신이 이제까지 원래지도에없는 값을 사용하는 일이 있다면 마음 당신은이 Comparator 구현은 매우 혼란 방법을 침입합니다.)

더 나은 아직, 그냥 Integer.compare(x, y)을 반환하는 너를 위해 모든 것을 해준다. (비록 Java 7에서만 가능합니다.)

+0

루이, 이것은 안타깝게도 작동하지 않습니다. 결과는 여전히 정렬되지 않은 것으로 나타납니다 – JAM

+0

원본지도에없는 값을 사용하면 편집에 문제가있는 것이 아니기 때문에'(Integer) null'을 언 박싱 할 때'NullPointerException'이 발생합니다. –

+0

@JAM, 업데이트 된 코드를 게시 할 수 있습니까? 이것은 그것이 작동 해야하는 것처럼 보입니다. –

0

비교기는 더 크거나 작은 값을 반환하지 않습니다. 값보다 음수를 나타내는 음수 값을 반환합니다.

if (x > y) 
    return x; 
if (y > x) 
    return y; 

return 0; 

아마

if (x > y) 
    return -1; 
if (y > x) 
    return 1; 

return 0; 
0

귀하의 비교기는 오직 값이 동일하다는 표시 또는 왼쪽이 오른쪽보다 큰 것을해야한다. x가 1이고 y가 음수를 반환해야 할 때 2. 귀하의 비교기는 2 — 양수 —를 반환합니다입니다

는 경우를 생각해 보자.

the Comparator interface documentation을 다시 공부하여 계약서에서 누락 된 부분을 확인하는 것이 좋습니다.

1
@Override 
public int compare(String a, String b) { 

    Integer x = m.get(a); 
    Integer y = m.get(b); 

    return x.compareTo(y); 
} 

값으로 정수 개체가 있으므로 암시 적 메서드를 사용하여 개체를 비교하고 1, 0 또는 -1을 반환 할 수 있습니다.

0
public static List<String> sortByValue(final Map<String, Integer> unsortedMap) { 
    List<String> sortedKeys = new ArrayList<String>(); 
    sortedKeys.addAll(unsortedMap.keySet()); 

    Collections.sort(sortedKeys, new Comparator<String>(){ 
     public int compare(String s1, String s2) { 
      return unsortedMap.get(s1).compareTo(unsortedMap.get(s2)); 
     }}); 
    return sortedKeys; 
}