Android中的SparseArray克隆

时间:2012-08-28 06:34:28

标签: java android sparse-array

我正在尝试迭代SparseArray并删除一些项目。

  

私人SparseArray记录;

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

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

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

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

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

5 个答案:

答案 0 :(得分:2)

根据Android API changes for SDK 14,我们发现SparseArray was modified to include a public clone

修改

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

答案 1 :(得分:2)

为什么不像这样得到数组的大小?或者只是使用尺寸 - 每当你删除一条记录?

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

答案 2 :(得分:2)

FYI在support-v4中,SparseArrayCompat可用于解决此问题及其他问题:

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

答案 3 :(得分:1)

Clone方法受Object类保护,因此任何类都必须明确提供它,但是我在文档中看到了这个方法而在源代码中没有。似乎我的API Level10而文档API level16。因此,请先检查API Level

@SuppressWarnings("unchecked")是因为Clone Object方法会返回Object,因为从doc开始,它似乎返回SparseArray<E>,这会导致内部方法不安全将Object转换为SparseArray<E>

答案 4 :(得分: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;
}