1

私はハッシュマップを持っています。このハッシュマップのキーの配列を取得したいのですが、配列をソートしたいと考えています。

たとえば、マップが次のようになっているとします。

<"2",obj1>
<"4",obj2>
<"6",obj3>
<"10",obj4>
<"5",obj5>
<"1",obj6>
<"15",obj7>
<"3",obj8>

配列を次のようにしたい: ["1", "2", "3", "4", "5", "6", "10", "15"]

速いほど良い。これを行うための組み込みの方法はありますか?

更新 1

TreeMap を使用している場合、キーは次の順序でソートされます。

「1」、「10」、「2」など。

しかし、私はそれらを「1」、「2」、「3」..「10」、「15」のようにしたい。

4

2 に答える 2

5

「10A」、「2AB」などのキーがいくつかあります

その場合、次のようなカスタムコンパレータが必要です

public static void main(String... args) {
    NavigableMap<String, Object> map = new TreeMap<String, Object>(new Comparator<String>() {
        final Pattern pattern = Pattern.compile("(\\d+)(.*)");

        @Override
        public int compare(String o1, String o2) {
            Matcher matcher1 = pattern.matcher(o1);
            Matcher matcher2 = pattern.matcher(o2);
            matcher1.find();
            matcher2.find();
            int cmp = Long.compare(Long.parseLong(matcher1.group(1)), Long.parseLong(matcher2.group(1)));
            if (cmp != 0)
                return cmp;
            return matcher1.group(2).compareTo(matcher2.group(2));
        }
    });

    map.put("1", "one");
    map.put("1A", "oneA");
    map.put("10", "ten");
    map.put("10AB", "tenAB");
    map.put("15", "fifteen");
    map.put("2", "two");
    map.put("2AB", "twoAB");
    map.put("2", "three");

    System.out.println(map.keySet());
}

版画

[1, 1A, 2, 2AB, 10, 10AB, 15]
于 2012-11-08T11:31:58.330 に答える
2

コードを自然にソートされた Map に変換することが何らかの理由で不可能な場合は、キーセットを返し、手動でソートするツールが組み込まれています -

    Object[] keys = yourMap.keySet().toArray();
    Arrays.sort(keys);

    System.out.println(Arrays.toString(keys));
于 2012-11-08T11:38:26.467 に答える