0

重複の可能性:
Java の値で Map<Key, Value> をソートする方法は?

Map<String, String>.Map contaionsを使用して Java でマップを作成しています<Id, Date>。これらの地図を日付順に並べ替えたい。どうやってやるの?印刷後の地図です

-------------------------------------
PTRRRRRR     08-20-2011
-------------------------------------
TESTDESC     08-01-2012
-------------------------------------
TESTMYO      12-29-2011
-------------------------------------
TESTTEST     08-01-2012
-------------------------------------
TESTPROL     08-01-2012
-------------------------------------
TESTPRO      08-01-2012
-------------------------------------
PNAMELQ      08-02-2012
-------------------------------------
TESTMYO      12-29-2011
------------------------------------
4

2 に答える 2

4

このようなカスタム Comparator を使用できます。

String data = "PTRRRRRR     08-20-2011\n" +
        "TESTDESC     08-01-2012\n" +
        "TESTMYO      12-29-2011\n" +
        "TESTTEST     08-01-2012\n" +
        "TESTPROL     08-01-2012\n" +
        "TESTPRO      08-01-2012\n" +
        "TESTPRO      08-01-2012\n" +
        "PNAMELQ      08-02-2012\n" +
        "TESTMYO      12-29-2011\n";
Map<String, String> map = new LinkedHashMap<String, String>();
for (String line : data.split("\n")) {
    String[] keyValue = line.split(" +");
    map.put(keyValue[0], keyValue[1]);
}
Map.Entry<String, String>[] entries = map.entrySet().toArray(new Map.Entry[map.size()]);
Arrays.sort(entries, new Comparator<Map.Entry<String, String>>() {
    SimpleDateFormat date = new SimpleDateFormat("MM-dd-yyyy");

    @Override
    public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
        try {
            return date.parse(o1.getValue()).compareTo(date.parse(o2.getValue());
        } catch (ParseException e) {
            throw new AssertionError(e);
        }
    }
});
for (Map.Entry entry : entries) {
    System.out.println(entry);
}

版画

PTRRRRRR=08-20-2011
TESTMYO=12-29-2011
TESTDESC=08-01-2012
TESTTEST=08-01-2012
TESTPROL=08-01-2012
TESTPRO=08-01-2012
PNAMELQ=08-02-2012
于 2012-08-30T08:18:27.807 に答える
1

最初にhttp://docs.oracle.com/javase/6/docs/api/java/util/Map.htmlMapを確認し、異なる実装があることに注意してください。

マップの順序は、マップのコレクションビューのイテレータが要素を返す順序として定義されます。TreeMapクラスなどの一部のマップ実装は、それらの順序に関して特定の保証を行います。HashMapクラスのような他のものはそうではありません。

http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.htmlには、次の定義があります。

マップは、使用されるコンストラクターに応じて、キーの自然な順序に従って、またはマップ作成時に提供されるコンパレーターによってソートされます。

値(Map<String, Date>)で比較するため、値で比較するを実装する必要がありComparatorます(これはテストされていません)。

class ValueComparator implements Comparator<String> {

    Map<String, Date> map;
    public ValueComparator(Map<String, Date> map) {
        this.map = map;
    }

    public int compare(String a, String b) {
        return map.get(a).compareTo(map.get(b));
    }
}

(ValueComparatorをより汎用的に構築することをお勧めします。)

最後に、でマップを作成します

Map<String, Date> sorted = new TreeMap<String, Date>(new ValueComparator(unsortedMap));
sorted.putAll(unsortedMap);
于 2012-08-30T08:29:18.620 に答える