2012-04-25 2 views
2

비교기 인터페이스를 사용하여 TreeMap (Double 값 및 정수 값으로 있음) 정렬하려면 노력하고 있지만 작동하지 않습니다. 다음지도에서 Java 정렬 작동하지 않습니다

// Create a tree map 
     TreeMap tm = new TreeMap(); 
     // Put elements to the map 
     tm.put(1, new Double(3434.34)); 
     tm.put(0, new Double(123.22)); 
     tm.put(4, new Double(1378.00)); 
     tm.put(2, new Double(99.22)); 
     tm.put(3, new Double(-19.08)); 
     List<Map.Entry> valueList = new ArrayList(tm.entrySet()); 

     // Collections.sort(valueList, new Sort()); 

     Collections.sort(valueList, new Sort()); 

     HashMap sortedMap = new HashMap(); 

     // Get an iterator 
     Iterator<Map.Entry> i = valueList.iterator(); 

     // Display elements 
     while (i.hasNext()) { 
      Map.Entry object = i.next(); 
      sortedMap.put(object.getKey(), object.getValue()); 
     } 
     List sortedList = new ArrayList(sortedMap.entrySet()); 
     Iterator<Map.Entry> iterator = sortedList.iterator(); 
     while (iterator.hasNext()) { 
      Map.Entry entry = iterator.next(); 
      System.out.println("Value " + entry.getValue() + "\n"); 
     } 

내 비교기 클래스

public class Sort implements Comparator<Map.Entry> { 

    @Override 
    public int compare(Map.Entry o1, Map.Entry o2) { 
     // TODO Auto-generated method stub 
     double valueOne = (Double) o1.getValue(); 
     double valueTwo = (Double) o2.getValue(); 

     int returnValue = 
      valueOne > valueTwo ? -1 : (valueOne == valueTwo ? 0 : 1); 

     return (valueOne > valueTwo ? -1 : (valueOne == valueTwo ? 0 : 1)); 
    } 

} 

입니다하지만 난

Value 123.22 

Value 3434.34 

Value 99.22 

Value -19.08 

Value 1378.0 

Edited Part 

public int compare(Map.Entry o1, Map.Entry o2) { 
     // TODO Auto-generated method stub 
     double valueOne = ((Double) o1.getValue()).doubleValue(); 
     double valueTwo = ((Double) o2.getValue()).doubleValue(); 

     int returnValue = 
      valueOne > valueTwo ? -1 : (valueOne == valueTwo ? 0 : 1); 

     return (valueOne > valueTwo ? -1 : (valueOne == valueTwo ? 0 : 1)); 
    } 
+0

는 대신,'=='기호로 두 값을 비교하는 비교해서는 안되는 '>'와'<', 아무도 값을 반환하지 않으면 0을 반환합니다. –

+0

빠른 대답을 부탁드립니다. 더블 클래스에서 doubleValue() 메서드를 사용하여 값을 double로 변경했지만 여전히 정렬되지 않습니다. 내 편집 된 부분을 참조하십시오. – Dilip

+0

JDK에는 값으로 정렬 할 수있는'Map' 구현체가 없습니다. –

답변

1

다른 사람이 이미 제안 무엇에 추가,이 시도 :

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.TreeMap; 

public class SortDemo 
{ 
    public class Sort implements Comparator<Map.Entry> 
    { 
    public int compare(Entry o1, Entry o2) 
    { 
     Double valueOne = (Double) o1.getValue(); 
     Double valueTwo = (Double) o2.getValue(); 
     return (int) Math.signum(valueOne.compareTo(valueTwo)); 
    } 
    } 

    public static void main(String[] args) 
    { 
    new SortDemo().foo(); 
    } 

    void foo() 
    { 
    TreeMap tm = new TreeMap(); 
    tm.put(1, new Double(3434.34)); 
    tm.put(0, new Double(123.22)); 
    tm.put(4, new Double(1378.00)); 
    tm.put(2, new Double(99.22)); 
    tm.put(3, new Double(-19.08)); 

    List<Map.Entry> valueList = new ArrayList(tm.entrySet()); 
    Collections.sort(valueList, new Sort()); 

    Iterator<Map.Entry> iterator = valueList.iterator(); 
    while (iterator.hasNext()) 
    { 
     Map.Entry entry = iterator.next(); 
     System.out.println("Value: " + entry.getValue()); 
    } 
    } 
} 
+0

작업 예제를 제공해 주셔서 감사합니다. – Dilip

5

HashMap는 본질적으로 정렬되지 다음과 같은 출력을 얻고있다.

대신에 먼저 비교기를 사용하여 TreeMap을 만들 수 있습니다.

1

HashMap에 입력하면 HashMap은 주문한지도가 아니기 때문에 주문을 유지하지 않습니다.

0

목록이 아니기 때문에 정렬을 위해 HashMap을 사용하면 작동하지 않습니다. ArrayList와 정렬 메소드를 조사해야합니다.

ArrayList<double> arr = new ArrayList<double>(); 
sort(arr) //sort ascending 
1

Comparator 작품 만 키가 아닌 항목. Comparator<Integer>이 필요하고이 Comparator의 인스턴스를 TreeMap 생성자로 전달하십시오. 당신의 예에서

TreeMap<Integer,Double> tm = new TreeMap<Integer,Double>(myIntegerComparator); 

, 당신이 볼 수있는 행동으로 인해 Integer의 표준 comparsion를 사용하여 TreeMap (IntegerComparable<Integer> 때문에이 작품)이다.

(, BTW 당신은 ​​또한 제네릭에 읽어해야하며, 다른 매개 변수 클래스뿐만 아니라, 당신의 컬렉션 클래스에서 사용.)

관련 문제