2

我正在尝试遍历SparseArray并删除一些项目。

私有 SparseArray 记录;

   int size = record.size();
        for (int index = 0; index < size; index++) {
            if (record.valueAt(index) < threshold){
                record.delete(record.keyAt(index));
            }
        }

但是如果我在迭代过程中删除项目,大小会改变,所以我不能使用它。我试图事先克隆稀疏数组。但是日食给了我错误

The method clone() from the type object is not visible

但是 SparseArray 的 api doc 和 Source code 都表明它存在并且是公开的。方法克隆也有一个注释@SuppressWarnings("unchecked")

抑制会改变方法的可见性吗?
任何人都知道如何解决这个问题或克隆 SparseArray?

4

5 回答 5

2

根据SDK 14 的 Android API 更改,我们发现SparseArray已修改为包含public clone.

编辑

在我的项目中,我为 SB 数组实现了自己的克隆代码:Source code here

于 2012-08-28T06:38:14.017 回答
2

你为什么不像这样得到数组的大小?还是只使用大小- 每当您删除记录时?

    for (int index = 0; index < record.size(); index++) {
        if (record.valueAt(index) < threshold){
            record.delete(record.keyAt(index));
            index--;
        }
    }
于 2012-08-28T06:45:50.183 回答
2

仅供参考,在 support-v4 中,SparseArrayCompat 可用于解决此问题等等:

http://developer.android.com/reference/android/support/v4/util/SparseArrayCompat.html

于 2015-01-23T05:29:16.113 回答
1

Clone方法受Object类保护,因此任何类都必须显式提供它,但是我在文档中看到了这个方法,而不是在源代码中。似乎 My API Levelis10和 docs API levelis 16。所以请先检查你的API Level

@SuppressWarnings("unchecked")是因为返回的Clone方法从 doc 似乎返回,这导致内部方法转换为不安全的转换ObjectObjectSparseArray<E>ObjectSparseArray<E>

于 2012-08-28T06:42:41.890 回答
1

克隆仍然没有在 Android 文档的 API 中更新,也没有在使用 API 9 编译时显示任何警告

所以我编写了自己的代码来克隆对象

public static SparseBooleanArray getClone(SparseBooleanArray sparseBooleanArray) {
    if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        return sparseBooleanArray.clone();
    return getCloneof(sparseBooleanArray);
}

private static SparseBooleanArray getCloneof(SparseBooleanArray sparseBooleanArray) {

    SparseBooleanArray temp = new SparseBooleanArray();
    try {
        int[] mKeys;
        boolean[] mValues;
        int mSize;
        Field mKeysField = sparseBooleanArray.getClass().getDeclaredField("mKeys");
        Field mValuesField = sparseBooleanArray.getClass().getDeclaredField("mValues");
        Field mSizeField = sparseBooleanArray.getClass().getDeclaredField("mSize");

        mKeysField.setAccessible(true);
        mValuesField.setAccessible(true);
        mSizeField.setAccessible(true);

        mKeys = (int[]) mKeysField.get(sparseBooleanArray);
        mValues = (boolean[]) mValuesField.get(sparseBooleanArray);
        mSize = (int) mSizeField.getInt(sparseBooleanArray);

        Field mKeysFieldtemp = temp.getClass().getDeclaredField("mKeys");
        Field mValuesFieldtemp = temp.getClass().getDeclaredField("mValues");
        Field mSizeFieldtemp = temp.getClass().getDeclaredField("mSize");

        mKeysFieldtemp.setAccessible(true);
        mValuesFieldtemp.setAccessible(true);
        mSizeFieldtemp.setAccessible(true);

        mKeysFieldtemp.set(temp, mKeys);
        mValuesFieldtemp.set(temp, mValues);
        mSizeFieldtemp.setInt(temp, mSize);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return temp;
}
于 2014-08-07T13:20:02.043 回答