【问题标题】:Sort SparseArray in Android在 Android 中对 SparseArray 进行排序
【发布时间】:2018-06-24 21:13:46
【问题描述】:

如何对android.util.SparseArray 进行排序? 例如。我有 SparseArray:
1 - 2.33
5 - 1.5
结果:
5 - 1.5
1 - 2.33

谢谢!!!

-- 已编辑

我已经使用了地图。感谢您的帮助。

【问题讨论】:

  • 为什么要对它进行排序?密钥不变,SparseArray 未实现 Iterable
  • Iterable 并不是什么大问题,但我同意如果目标是对这个数据结构进行排序,像Map 的子类这样的常见 Java 数据结构会做得更多感觉。并不是说您无法以所需的方式对 SpareArray 进行排序,但它比使用开箱即用的解决方案更有效。
  • @Tom:是的,他应该使用另一种数据结构。即使他设法对SparseArray 进行排序,他也无法从中以正确的顺序获取值。
  • @rocknow 关于您的编辑:Map 只是一个没有合同来排序的界面。可能你的意思是TreeMap

标签: android


【解决方案1】:

不清楚您是否请求了键或值排序顺序...

所以只是一个注释:

二分查找仅适用于已排序的数据,SparseArray 根据the source 对其排序的 (!) 键数组使用二分查找。所以键已经排序,不会接受与值顺序不同的顺序。

【讨论】:

    【解决方案2】:

    对@Karussell 的现场回答的一个小修改是,valueAt() 方法的文档本身也建议了一个排序顺序(在键上):

    [...] valueAt(0) 将返回与最小键关联的值,valueAt(size()-1) 将返回与最大键关联的值。

    keyAt() 方法也有类似的描述。

    【讨论】:

      【解决方案3】:

      您可以使用 TreeMap。它保持条目按其键排序(键必须实现 Comparable)。

      【讨论】:

      • 我认为这个答案是错误的。 LinkedHashMaps 本身没有排序,无论是在键上还是在值上。根据JavaSE 7 documentation 给出的唯一保证是保持键的迭代顺序:“[...] 通常是键插入映射的顺序(插入顺序)”。它没有说明对数据(或键)进行排序。
      • Shayan_Aryan 的意思可能是标准的 TreeMap 或类似 ConcurrentSkipListMap 的东西,请参阅 docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.html
      • @Karussell 是的,谢谢。我就是那个意思。我已经更新了我的答案。
      【解决方案4】:

      SparseArray.java 的底层源代码来看,你不能仅仅通过调用一个方法来做到这一点。所有SpareArray 是两个Java 语言数组,一个int 类型和一个Object 类型。这些数组是私有实例变量,没有反射就不能引用它们(这很危险,因为它们的名称可能会改变)。一个好的解决方案可能是在您的应用程序中本地化 SpareArray 代码并使用普通 Java 技术添加 sort 方法,即 Array.sort

      【讨论】:

        【解决方案5】:

        更新:

        private SparseIntArray void sortMap(SparseIntArray unsorted) {
            SparseIntArray sortedSparseIntArray = new SparseIntArray();
            while (unsorted.size() > 0) {
                int min = Integer.MAX_VALUE;
                int minIndex = 0;
                for (int i = 0; i < unsorted.size(); i++) {
                    if (unsorted.keyAt(i) <= min) {
                        min = unsorted.keyAt(i);
                        minIndex = i;
                    }
                }
                sortedSparseIntArray.put(min, unsorted.get(min));
                sFactorsMap.removeAt(minIndex);
            }
            return sortedSparseIntArray;
        }
        

        【讨论】:

          【解决方案6】:

          将您的键/值收集到列表中。

                          List<Integer>keys = Lists.newArrayList();
                          List<Integer>vals = Lists.newArrayList();
              SparseArray<Integer>arr;
              for(int i =0; i < arr.size();i++){
              keys.add(arr.keyAt(i));
              values.add(arr.valueAt(i));
              }
              Collections.sort(keys);// sort
              Collections.sort(vals); 
              // then fill your array again.
              arr.clear();
              //...
              arr.put()
          

          【讨论】:

          • 这绝对是一种有效的方法,但从性能的角度来看是危险的。您正在创建不需要创建的列表并调用方法只是为了获取数组项。另外,size 是一种方法,而不是一个字段。
          • 这肯定会搞乱键值的映射。
          猜你喜欢
          • 1970-01-01
          • 2016-11-16
          • 1970-01-01
          • 1970-01-01
          • 2020-03-23
          • 2013-07-15
          • 2016-07-08
          • 2014-02-18
          • 1970-01-01
          相关资源
          最近更新 更多