2

Comparatorインターフェースを使用してTreeMap(値としてDouble、キーとしてInteger値を持つ)をソートしようとしていますが、機能しません。

// 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));
    }
4

5 に答える 5

5

HashMap本質的に順不同です。

TreeMap代わりに、最初にコンパレータを使用して を作成できます。

于 2012-04-25T13:43:38.643 に答える
1

それらを に配置すると、は順序付きマップではないHashMapため、順序は保持されません。HashMap

于 2012-04-25T13:46:17.080 に答える
1

Comparatorエントリではなく、キーのみが機能します。が必要でComparator<Integer>、この Comparator のインスタンスをTreeMapコンストラクターに渡します。

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

あなたの例では、表示される動作はTreeMapusingIntegerの標準比較によるものです (これIntegerは is であるため機能しますComparable<Integer>)。

(ちなみに、ジェネリックについても読んで、コレクションクラスやその他のパラメーター化されたクラスで使用する必要があります。)

于 2012-04-25T13:58:47.233 に答える
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());
    }
  }
}
于 2012-04-25T13:57:03.377 に答える
0

リストではないため、ソートに HashMap を使用しても機能しません。ArrayList と sort メソッドを調べる必要があります。

ArrayList<double> arr = new ArrayList<double>();
sort(arr) //sort ascending 
于 2012-04-25T13:50:07.513 に答える