在Java中:获取地图键的排序数组

时间:2012-11-08 11:29:38

标签: java hashmap

我有一个hashmap,我希望在这个hashmap中获得一个键数组,但我希望对数组进行排序。

例如,如果地图如下所示:

<"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”。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:2)

如果由于某种原因将代码转换为自然排序的地图不是一个选项,则有内置工具可以返回密钥集并手动对其进行排序 -

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

    System.out.println(Arrays.toString(keys));