2014-11-29 4 views
-6
private SortedSet<Entry<String,Integer>> getSortedSet(Map<String, Integer> dictionary) { 
    SortedSet<Entry<String,Integer>> sorted = 
      new TreeSet<Entry<String,Integer>>(new Comparator<Entry<String,Integer>>() { 
       @Override 
       public int compare(Entry<String, Integer> e1, Entry<String, Integer> e2) { 
        if(e1.getValue() > e2.getValue()) { 
         return -1; 
        } 
        else if(e1.getValue() == e2.getValue()) { 
         return e1.getKey().compareTo(e2.getKey()); 
        } 
        else return 1; 
       } 
       }); 
    sorted.addAll(dictionary.entrySet()); 
    return sorted; 
} 

그래서이 코드를 설명했습니다. 정렬 된 세트, 트리 세트 및 비교기와 같은 각 구성 요소는 무엇을하는지는 알고 있지만 함께 놓았을 때 어떻게 작동하는지 잘 모르겠습니다. getSortedSet은 메소드이지만, 혼란스러워지면 어떻게 될까요? SortedSet은 getSortedSet 메소드 내부의 다른 메소드에서 "정렬"되어 있습니다. 누군가 내게 자세히 설명해 주시면 정말 감사하겠습니다. 감사누군가이 코드를 설명해 주시겠습니까

+3

일부 샘플 데이터가있는 코드를 단계별로 실행하고 있는지 확인하십시오. –

+0

비교기를 사용하여'Map'에서 엔트리를 정렬합니다. –

+0

컬렉션과 함께 Java 코드를 작성한 적이 있습니까? –

답변

0

는 당신이 코드는

class Value { 
    int number; 
    String name; 
} 

private SortedSet<Value> getSortedSet(List<Value> inputList) { 

    Comparator<Value> comparator = new Comparator<Value>() { 
     public int compare(Value o1, Value o2) { 
      int compare = Integer.compare(o1.number, o2.number); 
      if (compare == 0) { 
       compare = o1.name.compareTo(o2.name); 
      } 
      return compare; 
     } 
    }; 

    SortedSet<Value> sorted = new TreeSet<>(comparator); 

    for (Value value : inputList) { 
     sorted.add(value); 
    } 

    return sorted; 
} 
  • dictionary.entrySet()이 방법은 정렬 된 세트에 투입하고자 것들의 모음 inputList처럼 거의 비슷하다.
  • Entry/Value에는 1 개 이상의 속성이 있으므로 비교기는 먼저 1을 비교하고 동일한 경우 두 번째 비교와 비교합니다. "번호순으로 이름순으로 정렬"
  • SortedSet 인터페이스의 구체적인 구현 방법은 TreeSet입니다.
  • 일단 구성되면 원래 컬렉션의 모든 값을 추가하기 만하면됩니다. addAll 메서드는 향상된 for-each 루프의 줄임말입니다.

sorted은 정말 긴 형식의 선언 및 할당이있는 로컬 변수입니다. 1 개의 커다란 진술 내에서 즉석에서 작성된 비교 객체도 있습니다.

관련 문제