2013-11-25 3 views
0

값에 따라 TreeMaps를 정렬하는 방법을 이전에 검색했지만이를 수행하는 함수를 찾을 수 있었지만 이제는 remove() 메서드에 문제가있는 것처럼 보였습니다. 키를 사용하여 제거하지만 작동하지 않는 방법, 그리고 정렬 기능을 완전히 이해하지 못했다는 사실을 말하면 누군가가 문제를 설명 할 수 있습니까?정렬 된지도 제거 허용되지 않음

강령 :

public static void main(String[] args) { 
    TreeMap<String,Integer> theTree = new TreeMap<String,Integer>(); 
    theTree.put("A", 5); 
    theTree.put("B", 3); 
    theTree.put("F", 1); 
    theTree.put("D", 5); 
    theTree.put("E", 6); 
    theTree.put("C", 7); 
    System.out.println(theTree.toString()); 
    Map<String,Integer> sortedTree = new TreeMap<String,Integer>(); 
    sortedTree = sortByValues(theTree); 
    System.out.println(sortedTree.toString()); 
    for (Map.Entry<String, Integer> entry : sortedTree.entrySet()) 
    { 
     if(entry.getKey().equals("A")) 
      sortedTree.remove(entry.getKey()); 
    } 
    System.out.println(sortedTree.toString()); 
    theTree = new TreeMap<String,Integer>(sortedTree); 
    theTree.remove("B"); 
    System.out.println(theTree.toString()); 
} 

public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) { 
    Comparator<K> valueComparator = new Comparator<K>() { 
     public int compare(K k1, K k2) { 
      int compare = map.get(k2).compareTo(map.get(k1)); 
      if (compare == 0) return 1; 
      else return compare; 
     } 
    }; 
    Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); 
    sortedByValues.putAll(map); 
    return sortedByValues; 
} 

아웃풋 :

{A=5, B=3, C=7, D=5, E=6, F=1} 
{C=7, E=6, A=5, D=5, B=3, F=1} 
{C=7, E=6, A=5, D=5, B=3, F=1} 
{A=5, C=7, D=5, E=6, F=1} 

는 A가

당신의 비교기에서

답변

1

에만 Iterator를 통해 map traversal 동안 삭제할 수 있습니다 반복 Iterator을 통해 일어나고 있지 않은 경우하지의 반복에서 다른 제거 ConcurrentModificationException를 슬로우 동안

Map<String,Integer> sortedTree = new TreeMap<String,Integer>(); 
      System.out.println(sortedTree.toString()); 
      Iterator<Entry<String,Integer>> itr = sortedTree.entrySet().iterator(); 
      while(itr.hasNext()) 
      { 
       Entry<String,Integer> entry = itr.next(); 
       if(entry.getKey().equals("A")) 
        itr.remove(); 
      } 

map.remove

잘 작동합니다. 다른 많은 컬렉션에서도 그렇습니다.

내가 TreeMap javadoc에 따라 의미가 무엇 :이 클래스의 "모음보기 방법"모든 의해 반환되는 컬렉션 의 iterator 메소드에 의해 반환

반복자 있습니다 르파 다음의 경우 반복자가 반복자가 작성된 후 언제든지 구조적으로 수정됩니다. 반복자 자신의 제거 메소드를 통하는 경우를 제외하고 어떤 방식 으로든 반복기는
ConcurrentModificationException을 발생시킵니다.

+0

그게 뭐죠? http://ideone.com/hSS5OS –

+0

@ZouZou Comparator에 대한 설명이 왜 제거에 실패했는지 대답합니다. – bjhaid

+0

@bjhaid 예.하지만 초기 문제는 아니 었습니다. 그의 설명에서지도 순회가 빠져 있었다. –

4

, 당신이 0을 반환의 기회를 제거하는지도 아직 (if (compare == 0)return 1) 따라서 제거하려고 할 때 입력 된 값이 Set의 값과 같을 확률은 결코 없으며 아무 것도 제거되지 않습니다. 만약 당신이 왜 평등하다고 생각 될지 모르는 특별한 이유가 없다면 당신의 콤퍼레이터에서 그 라인을 지우십시오.

+0

내가 말했듯이, 나는 그것을 완전히 이해하지 못했지만, 그것을 제거하려고 시도했고, 즉시 비교하고, 약간의 오류를 일으켰으며 theTree 만 인쇄했다. – HElwy

+1

비교기는 항목이 어떻게 맵에 배치되는지 결정한다. 0보다 작 으면 k1 k2를 의미합니다. 0을 반환하지 않으면 삭제할 때 비교자를 사용하고 절대로 k1 = k2를 찾지 않으므로 삭제하려는 항목을 찾지 못하므로 아무 것도 삭제하지 않습니다. 또한 오류가 발생하는 경우 게시하십시오. – Sinkingpoint

+0

"스레드"main "에서 예외가 발생했습니다. at java.util.TreeMap $ PrivateEntryIterator.nextEntry (TreeMap.java:1115) \t at java.util.TreeMap $ EntryIterator.next (TreeMap.java:1151) \t at java.util.TreeMap $ EntryIterator.next (TreeMap.java:1146) " – HElwy

관련 문제