【问题标题】:In Android, how do I order a LinkedHashMap?在 Android 中,如何订购 LinkedHashMap?
【发布时间】:2014-01-28 19:54:46
【问题描述】:

我有一个 LinkedHashMap,它存储一个订单号作为键,一个字符串值作为值:

{12,"apple"}
{1,"grape"}
{23,"pineapple"}
{2,"pear"}
{16,"cherry"}

在对它们进行任何其他操作之前,我需要对它们进行排序。我正在考虑编写一个比较器,但对于如何完成我想要完成的工作有点迷茫。

【问题讨论】:

  • LinkedHashMap 保留迭代顺序。这确实意味着它是按以下标准排序的:插入顺序;无法为其提供您的自定义标准。

标签: android sorting linkedhashmap


【解决方案1】:

通常,任何在其类型中具有Hash 名称的东西都不适合订购,至少不是大多数人订购的方式。哈希结构之所以如此高效,是因为它们有自己的基于哈希的访问/检索函数,这使得分配项目的方式不是我们所知道的“有序”,所以这种方式对于访问和写入非常有效,但它们没有允许这种排序。

【讨论】:

    【解决方案2】:

    考虑改用 TreeMap,它会根据 Integer 键自动按升序对添加到其中的元素进行排序。

    TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();
    
    treeMap.add(1, "foo");
    treeMap.add(3, "baz");
    treeMap.add(2, "bar");
    

    按整数键的升序遍历此 TreeMap 将打印“foo bar baz”。

    【讨论】:

    • 现在调查一下
    • 你也可以使用 NavigableMap,在其中你可以有降序或升序键。这样...... new TreeMap().descendingMap()
    • TreeMap 没有给出我想要的精确排序。我使用了树图。它一直有效。 treeMap.add(1, "foo"); treeMap.add(3, "baz"); treeMap.add(2, "bar");但它不适用于 treeMap.add(6, "foo"); treeMap.add(7, "baz"); treeMap.add(8, "bar"); treeMap.add(9, "bar"); treeMap.add(10, "bar"); treeMap.add(11, "bar"); treeMap.add(12, "bar");它需要像下面的 treeMap.add(10, "bar"); treeMap.add(11, "bar"); treeMap.add(12, "bar"); treeMap.add(6, "foo"); treeMap.add(7, "baz"); treeMap.add(8, "bar"); treeMap.add(9, "bar");
    【解决方案3】:

    就像 NKN 之前所说的,HashMap 并不是要订购的。 LinkedHashMap 的好处是它可以维护插入错误,但它不提供排序机制。

    为了实现你想要创建一个 POJO 类来保存你的数据

    public class fruit {
    int count;
    String name;
    
    // getters and setter 
    }
    

    而不是让该对象实现Comparable 接口,并覆盖compareTo() 方法。完成后,您可以致电

    Collections.sort(linkedHashMap)

    【讨论】:

      【解决方案4】:

      本质上,地图是“无序/无序”集合,如果您需要类似的东西,可以使用其他方法,例如 SparseArray(更适合 int/value 元素),您可以创建一个 int 键列表,对其进行排序,然后遍历它们,得到如下值:

      //This would be your SparseArray
      {12,"apple"}
      {1,"grape"}
      {23,"pineapple"}
      {2,"pear"}
      {16,"cherry"}
      
      int[] sortedInt = {1,2, 12, 16, 23};//Previously sorted values using any Java sorting functionality
      for(int i = 0 ; i < sortedInt.length; i++){
          String value = yourSparseArrat.get(sortedInt[i]);
      }
      

      然后就可以了,通过对键进行排序,然后按该顺序获取值,即可得到所需的值。

      问候!

      【讨论】:

        【解决方案5】:

        如果您需要按某种顺序存储Map,则必须使用TreeMap 而不是LinkedHashMapLinkedHashMap 只需存储元素以添加元素。 这样使用TreeMap


        TreeMap<Integer, String> map = new TreeMap<Integer, String>(
                    new Comparator<Integer>() {
                        @Override
                        public int compare(Integer o1, Integer o2) {
                            if (o1 > o2) return 1;
                            if (o1 < o2) return -1;
                            else return 0;
                        }
                    }
            );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-28
          相关资源
          最近更新 更多