我需要编写一个处理Map<String, String[]>
的类,根据它们的数字顺序处理它的键。为了增加对伤害的侮辱,一些键不是有效的整数,它们应该在最后以加入的词典顺序处理。
例如,如果键是:
["10", "2", "100", "duck", "black"]
他们应该按此顺序迭代 -
["2", "10", "100", "black", "duck"]
除了迭代和尝试捕捉NumberFormatException
之外,在Java中最优雅的方式是什么?显然,我无法控制给定地图的格式。
答案 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()
之类的事情,然后修改它,如果数字字符串不是第一个。)