我有一个地图,里面有键和值
键:-案例1,案例2......case 10
值:- Jan,Feb......Oct
现在,当我把这张地图放在数组列表中时(这样我就可以对它进行排序)
for (String key : dataValueMap.keySet()) {
System.out.println(key + " " + dataValueMap.get(key));
}
ArrayList<String> keys = new ArrayList<String>(
dataValueMap.keySet());
Collections.sort(keys);
for (String counter : keys) {
System.out.println(counter); >>>>>BUT it prints like :- case 1 then case 10 then case 2, case 3, case 4 etc.
}
请帮忙解决这个问题,
提前感谢
发布于 2016-10-13 05:14:57
使用自定义Comparator
实现对集合进行排序。它接受并比较键的整数,但依赖于大小写n的格式。
示例
List<String> keys = new ArrayList<>();
keys.add("case 10");
keys.add("case 3");
keys.add("case 1");
keys.add("case 2");
Collections.sort(keys, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
s1 = s1.split(" ")[1];
s2 = s2.split(" ")[1];
return Integer.compare(Integer.parseInt(s1), Integer.parseInt(s2));
}
});
for (String key : keys) {
System.out.println(key);
}
发布于 2016-10-13 05:17:50
如果您确定键格式,则可以按空间将其拆分,并将实际值与比较器进行比较,例如:
Map<String, Object> myMap =
new TreeMap<String, Object>(new Comparator<String>()
{
public int compare(String o1, String o2)
{
Integer value1 = Integer.parseInt(o1.split("\\s+")[1]);
Integer value2 = Integer.parseInt(o2.split("\\s+")[1]);
return value1.compareTo(value2);
}
});
虽然如果键格式不正确,它会中断,但我们可以根据预期的行为添加对该格式的处理。
发布于 2016-10-13 05:46:19
那么,您只需为您的字符串版本定义一个新的自定义Comparator
,并且可以编写将从列表中比较两个字符串的任何逻辑。
List<String> keys = new ArrayList<>();
keys.add("case 10");
keys.add("case 3");
keys.add("case 1");
keys.add("case 2");
Comparator<String> comparator = new Comparator<String>(){
@Override
public int compare(String s1, String s2) {
return Integer.compare(Integer.parseInt(s1.substring(5)), Integer.parseInt(s2.substring(5)));
}
};
Collections.sort(keys, comparator);
for (String counter : keys) {
System.out.println(counter);
}
https://stackoverflow.com/questions/40021925
复制