66

2番目の配列リストに表示されていない要素を見つけるための最良の方法を見つけなければなりません。仮定する

Arraylist a,b, 

Arraylist a={1,2,3,4,5};
Arraylist b={2,3,4};

したがって、基本的に私が望むのは、 arraylist bに存在しないa の要素を見つけることです。

それで、それを行うための最良の解決策は何ですか?

4

10 に答える 10

105
List<Integer> c = new ArrayList<>(a);
c.removeAll(b);

リストの代わりにセットを使用することも検討してください。

于 2012-11-08T09:24:51.903 に答える
15

この目的のために明示的にメソッドを持つApache Commons Collectionsを使用できます。

public static void main(String[] args) {
    List<Integer> a = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
    List<Integer> b = Arrays.asList(new Integer[] { 2, 3, 4 });
    Collection<Integer> aMinusB = CollectionUtils.subtract(a, b);
    System.out.println(aMinusB);
}

出力結果は[1, 5]です。

Apache Commons ライブラリは十分にテストされており、標準の Java 機能を拡張するために一般的に使用されています。この特定のメソッドはパラメーターとして受け入れるIterableため、必要に応じて使用できCollectionます。異なるコレクション タイプを混在させることもできます。

public static void main(String[] args) {
    List<Integer> a = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
    Set<Integer> b = new HashSet<Integer>(Arrays.asList(new Integer[] { 2, 3, 4 }));
    Collection<Integer> aMinusB = CollectionUtils.subtract(a, b);
    System.out.println(aMinusB);
}

出力結果は同じ[1, 5]です。

ここでJavadocをチェックしてください。


完全を期すために、Google のGuavaライブラリにはこの機能がありません:

Collection *subtract*(Collection, Collection)
同等のものはありません。a を含む ArrayList を作成し、b の各要素に対して remove を呼び出します。

ただし、メソッドと呼ばれるSets.difference()メソッドを実装しています。これは、グアバを好み、セットを操作する場合に使用できます。

public static void main(String[] args) {
    Set<Integer> a = new HashSet<Integer>(Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 }));
    Set<Integer> b = new HashSet<Integer>(Arrays.asList(new Integer[] { 2, 3, 4 }));
    Set<Integer> aMinusB = Sets.difference(a, b);
    System.out.println(aMinusB);
}

a結果は、に存在しないすべての要素になりますb(つまり[1, 5]再び)。もちろん、セットで動作するため、順序は決まっていません。

于 2012-11-08T09:54:03.007 に答える
10

あなたが試すことができますremoveAll

List<Integer> notPresent = new ArrayList<Integer>(a);
notPresent.removeAll(b);
于 2012-11-08T09:23:52.213 に答える
9

使用するorg.apache.commons.collections4.ListUtils

与えられた

List<Integer> a = Arrays.asList(new Integer[]{  1,2,3,4,5});
List<Integer> b = Arrays.asList(new Integer[]{0,1,2,3});

アクション

List<Integer> c = ListUtils.removeAll(b, a)

リスト c の結果

4, 5
于 2016-08-30T09:29:35.330 に答える
2

このようにしてみてください

for (Object o : a) {  
  if (!b.contains(o)) {  
    // this is not present
  }  
}  
于 2012-11-08T09:24:08.873 に答える
1

これを試して:

 public static void main(String[] args) {
        List<Integer> a = new ArrayList<Integer>();
        List<Integer> b = new ArrayList<Integer>();
        List<Integer> exclusion = new ArrayList<Integer>();

        a.add(1);
        a.add(2);
        a.add(3);
        a.add(4);

        b.add(1);
        b.add(2);
        b.add(3);
        b.add(5);

        for (Integer x : a) {
            if (!b.contains(x)) {
                exclusion.add(x);
            }
        }

        for (Integer x : exclusion) {
            System.out.println(x);
        }

    }
于 2012-11-08T09:35:41.190 に答える
1

1 つのリストをループしてから、を使用して他のリストの各要素が含まれているかどうかを確認します。

于 2012-11-08T09:24:35.710 に答える
1

このようなもの。に重複があると思われる場合は、 forなどのa別のタイプの を試すことができます。CollectionSetnotPresent

   List<Integer> notPresent = new ArrayList<Integer>();

    for (Integer n : a){
     if (!b.contains(n)){
       notPresent.add(n);
     }
    }
于 2012-11-08T09:25:37.210 に答える
0

これを試して...

contains()Listの方法を使用します。

ArrayList<Integer> aList = new ArrayList<Integer>();

for (Integer i : a){

      if (!(b.contains(i))){

             aList.add(i);

       }

     else{
             continue;

      }

 }
于 2012-11-08T09:27:42.647 に答える