根据数字值对Map的String键进行排序

时间:2012-03-04 15:24:18

标签: java sorting map key

我需要编写一个处理Map<String, String[]>的类,根据它们的数字顺序处理它的键。为了增加对伤害的侮辱,一些键不是有效的整数,它们应该在最后以加入的词典顺序处理。

例如,如果键是:

["10", "2", "100", "duck", "black"]

他们应该按此顺序迭代 -

["2", "10", "100", "black", "duck"]

除了迭代和尝试捕捉NumberFormatException之外,在Java中最优雅的方式是什么?显然,我无法控制给定地图的格式。

2 个答案:

答案 0 :(得分:6)

由于您需要以不是输入映射的自然顺序的特定顺序进行迭代,因此您需要将其转储到另一个映射(如果不需要每个键的关联值,则将其转储到列表中)。将TreeMap与自定义比较器一起使用:

class NumbersThenWordsComparator implements Comparator<String> {
    private static Integer intValue(String s) {
        try {
            return Integer.valueOf(s);
        } catch (NumberFormatException e) {
            return null;
        }
    }

    @Override
    public int compare(String s1, String s2) {
        Integer i1 = intValue(s1);
        Integer i2 = intValue(s2);
        if (i1 == null && i2 == null) {
            return s1.compareTo(s2);
        } else if (i1 == null) {
            return -1;
        } else if (i2 == null) {
            return 1;
        } else {
            return i1.compareTo(i2);
        }
    }       
}

public void myMethod(Map<String, String[]> originalMap) {
    TreeMap<String, String[]> t =
        new TreeMap<String, String[]>(new NumbersThenWordsComparator());
    t.putAll(originalMap);
    // now iterate over t, which will produce entries in the desired order
}

答案 1 :(得分:0)

使用SortedMap,根据其自然顺序对键进行排序。对于字符串,它是词典。我不确定数字是否出现在字母之前,但是排序方式定义得很好且一致,所以你可以正确处理它以获得数字的第一个或最后一个(即做ArrayList<String> keys = yourMap.keySet()之类的事情,然后修改它,如果数字字符串不是第一个。)