1

から珍しい要素を削除するにはどうすればよいArrayListですか? シナリオは、 と の 2 つのArrayListオブジェクトがarr1ありarr2ます。arr2のほぼすべての要素が含まれていますarr1arr1にない要素を から削除したいと思いarr2ます。

どうすればこれを達成できますか? ArrayList2 つのオブジェクト間の一般的でない要素を削除する方法または手法はありますか?

4

5 に答える 5

4

使用CollectionUtils.retainAll:collection2にもあるcollection1のすべての要素を含むコレクションを返します。

ArrayList commonList = CollectionUtils.retainAll(list1,list2);

次に、forループで一般的でない要素を削除します

于 2013-01-15T07:09:42.900 に答える
3

retainAllArrayListに実装されているメソッドを使用できます。集合交差点のようなものです。

于 2013-01-15T07:08:34.967 に答える
1

どうarr1.retainAll(arr2);ですか?

于 2013-01-15T07:14:18.530 に答える
1

方法 1:

arr1.retainAll(arr2)

方法 2:

    List<String> arr1;
    List<String> arr2 ;

    for(String s: arr2){
        if(arr1.contains(s))
            arr1.remove(s);
    }

個人的には、表現力とパフォーマンス効率が高い 1 の方が優れていると感じています。arr1 が arr2 と等しくない場合、JDK は、個々の要素を削除するのではなく、完全にSystem.arraycopy()コピーするために使用します。System.arraycopy はネイティブに実装されており、非常に高速です。arr2arr1

以下は、これを行うJDKコードへの参照です。

    private boolean batchRemove(Collection<?> c, boolean complement) {
    final Object[] elementData = this.elementData;
    int r = 0, w = 0;
    boolean modified = false;
    try {
        for (; r < size; r++)
            if (c.contains(elementData[r]) == complement)
                elementData[w++] = elementData[r];
    } finally {
        // Preserve behavioral compatibility with AbstractCollection,
        // even if c.contains() throws.
        if (r != size) {
            System.arraycopy(elementData, r,
                             elementData, w,
                             size - r);
            w += size - r;
        }
        if (w != size) {
            for (int i = w; i < size; i++)
                elementData[i] = null;
            modCount += size - w;
            size = w;
            modified = true;
        }
    }
    return modified;
}

ごく少数の要素のみが異なる場合は、方法 2 の方が適切です。

于 2013-01-15T07:31:25.463 に答える