【问题标题】:Why can' t I Convert SparseArray to Array?为什么我不能将 SparseArray 转换为数组?
【发布时间】:2015-08-05 16:22:02
【问题描述】:

我最近开始使用 Android SparseArray 代替 ArrayList 来处理少量项目。我想知道为什么它不像普通的 ArrayList 那样包含 toArray() 方法?它包含一个用于值的私有对象数组,但无法返回它们。在我看来,这将是一种有用的方法,因为 ArrayList 到数组的转换在 Android 中很常见。我假设由于散列的工作方式,它会返回一个带有空槽的数组?

我的第二个问题是,将 SparseArray 转换为普通 Object 数组的最有效方法是什么?

【问题讨论】:

  • 可能最好从 SparseArray 转换为 ArrayList 到一个数组。
  • 我将不得不这样做。这似乎是一个不必要的手动步骤。

标签: java android arraylist


【解决方案1】:

要回答您的问题的标题,没有办法解决这个问题,因为 SparseArray 不是数组,它实际上是 HashMap 的优化,将任意整数绑定到任意值。优化在于它不使用 HashMap 的装箱/拆箱。

然后是第二部分,如何将其转换为数组,我建议使用 size() 和 keyAt(index) 确定最大数组索引,然后分配适当大小的数组,最后使用复制所有值get(index, default) 具有合理默认值的方法。

【讨论】:

    【解决方案2】:

    没有这样的方法可以做到这一点,但你可以转换 SparseArray 迭代:

    public static <C> List<C> ConvertToList(SparseArray<C> sparseArray) {
        if (sparseArray == null) return null;
        List<C> arrayList = new ArrayList<C>(sparseArray.size());
    
        for (int i = 0; i < sparseArray.size(); i++)
            arrayList.add(sparseArray.valueAt(i));
        return arrayList;
    }
    

    【讨论】:

    • 这里的“”是什么意思?
    • 你传入 SparseArray 的数据类型
    【解决方案3】:

    Kotlin 版本:

        private inline fun <reified VALUE> SparseArray<VALUE>.toArrayOrNull(): Array<VALUE>? {
            return if (isNotEmpty()) {
                Array<VALUE>(size()) { index -> this[index] }
            } else {
                null
            }
        }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多