我有一个 HashMap 哪个未排序的值
%AgregateSummAll(SumAllReg,SumNatlReg);
当我尝试使用cols排序时,我得到了类似排序值
的内容[{cols=2, row=2}, {cols=0, row=2}, {cols=6, row=1}, {cols=8, row=1}, {cols=4, row=1}
, {cols=10, row=1}, {cols=2, row=1}, {cols=0, row=1}, {cols=8, row=4}, {cols=6, row=2},
{cols=8, row=2}, {cols=4, row=2}, {cols=6, row=4}, {cols=2, row=4}, {cols=10, row=2},
{cols=4, row=4}, {cols=10, row=4}, {cols=0, row=4}]
它应该产生0,2,4,6,8,10而不是它产生0,10,2,4,6,8
我的散列图排序代码是
[{cols=0, row=2}, {cols=0, row=1}, {cols=0, row=4}, {cols=10, row=1}, {cols=10, row=2},
{cols=10, row=4}, {cols=2, row=2}, {cols=2, row=1}, {cols=2, row=4}, {cols=4, row=1},
{cols=4, row=2}, {cols=4, row=4}, {cols=6, row=1}, {cols=6, row=2}, {cols=6, row=4},
{cols=8, row=1}, {cols=8, row=4}, {cols=8, row=2}]
答案 0 :(得分:1)
HashMap本身不能保证顺序:
来自:http://developer.android.com/reference/java/util/HashMap.html
请注意,HashMap的迭代顺序是非确定性的。如果您想要确定性迭代,请使用LinkedHashMap。
或者更一般地说,在Java文档中: http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。
如果您想要访问它们,请使用TreeMap:
答案 1 :(得分:1)
我尝试这个时遇到了同样的问题。经过一些搜索,我尝试了下面的代码,工作正常。
class MapComparetor implements Comparator<Map<String, String>> {
private String key = "";
public MapComparetor(String key) {
this.key = key;
}
@Override
public int compare(Map<String, String> lhs, Map<String, String> rhs) {
String firstvalue = lhs.get(key);
String secondvalue = rhs.get(key);
if (Integer.valueOf(firstvalue) >= Integer.valueOf(secondvalue)) {
return 1;
} else {
return -1;
}
}
}
短缺很好。
答案 2 :(得分:-1)
根据评论
更新代码中的小修补程序我们知道HashMap默认不保留任何顺序。如果需要,您需要使用TreeMap或Comparators根据需求对其进行显式排序。
在您的情况下,它听起来您正在排序基于字符串的标准。有了它,10来自2,等等。
您是否已映射了一组字符串,或者是否已将它们转换为比较器中的字符串?不清楚。无论如何这里它是一个快速的&amp;两种假设都是肮脏的解决方案。
如果它们真的是字符串:
public Comparator<Map<String, String>> mapComparatorCols =
new Comparator<Map<String, String>>() {
public int compare(Map<String, String> m1, Map<String, String> m2) {
int foo1 = Integer.parseInt(m1.get("cols"));
int foo2 = Integer.parseInt(m2.get("cols"));
// two alternative returns
// faster giving the distance
return (foo1 - foo2);
// safer with no distance
return (foo1 < foo2) ? -1 : (foo1 > foo2) ? +1 : 0;
}
};
如果真的是他们的话:
public Comparator<Map<int, int>> mapComparatorCols =
new Comparator<Map<int, int>>() {
public int compare(Map<int, int> m1, Map<int, int> m2) {
// change it using ?: operator, if you prefer (see above)
return (m1.get("cols") - m2.get("cols"));
}
};