尝试排序HashMap但不生成正确的结果

时间:2015-08-05 07:35:03

标签: android sorting hashmap

我有一个 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}]

3 个答案:

答案 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"));
       }
    };