【问题标题】:Trying To Sort HashMap But Not Produce Correct Result尝试对 HashMap 进行排序但未产生正确的结果
【发布时间】:2015-08-05 07:35:02
【问题描述】:

我有一个 HashMap,其中包含 未排序的值

[{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}]

当我尝试使用 cols 进行排序时,我得到了类似 Sorted value

 [{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,2,4,6,8,10 而不是这些它产生 0,10,2,4,6,8

我的 hashmap 排序代码是

Collections.sort(upperlist, mapComparatorCols)

public Comparator<Map<String, String>> mapComparatorCols = new Comparator<Map<String, String>>() {
  public int compare(Map<String, String> m1, Map<String, String> m2) {
        return m1.get("cols").compareTo(m2.get("cols"));
     }
};

【问题讨论】:

    标签: android sorting hashmap


    【解决方案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

    【讨论】:

      【解决方案2】:

      我在尝试这个时遇到了同样的问题。经过一番搜索,我尝试了下面的代码,它工作正常。

      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;
                  }
              }
          }
      

      它的短路非常好。

      【讨论】:

        【解决方案3】:

        更新了基于 cmets 的代码中的一个小修复

        我们知道 HashMap 默认不保留任何顺序。如果有需要,您需要使用 TreeMap 或 Comparator 根据要求明确对其进行排序。

        在您的情况下,听起来您正在根据基于字符串的标准进行排序。有了它,10 在 2 之前,等等。

        您是否映射了一组字符串,或者您是否在比较器中将它们转换为字符串?不清楚。无论如何,这对于这两个假设来说都是一个快速而肮脏的解决方案。

        如果它们真的是字符串:

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

        【讨论】:

        • 你能告诉我它返回了什么吗 (foo1 - foo2); ...虽然你的 ans 正在工作
        • 你是对的。这是一个快速而快速的解决方案。另一种选择是“if (foo1
        • 现在我将代码更改为 if (foo1
        • 是的,这没有错,但请记住,“return (foo1 - foo2)”可能会导致合理的更快排序,因为它给出了 foo1 和 foo2 之间的距离,并且 java 排序算法使用 isìt (如果我记得我以前的研究:-)
        猜你喜欢
        • 2014-05-13
        • 1970-01-01
        • 2022-11-29
        • 2017-05-06
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多