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

Ada*_*tan 0 java sorting key map

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

例如,如果键是:

["10", "2", "100", "duck", "black"]
Run Code Online (Sandbox Code Playgroud)

他们应该按此顺序迭代 -

["2", "10", "100", "black", "duck"]
Run Code Online (Sandbox Code Playgroud)

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

jac*_*obm 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
}
Run Code Online (Sandbox Code Playgroud)