我有一个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”。
答案 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));