web-dev-qa-db-ja.com

別の配列リストに存在しない配列リストの要素を見つける

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

Arraylist a,b, 

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

だから基本的に私が欲しいのは、arraylist bにはないaの要素を見つけることです。

それを行うための最良のソリューションは何ですか?

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

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

77
Puce

removeAllを試すことができます:

List<Integer> notPresent = new ArrayList<Integer>(a);
notPresent.removeAll(b);
10

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 here を確認してください。


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

Collection *subtract*(Collection, Collection)
同等物なし-aを含むArrayListを作成し、bの各要素に対してremoveを呼び出します。

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

_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]再び)。もちろん、セットで動作するため、順序は決定されません。

7
Magnilex

Java 8-

a.stream().filter(b::contains).collect(Collectors.toList());
7
Rup

つかいます 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
5
mika

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

for (Object o : a) {  
  if (!b.contains(o)) {  
    // this is not present
  }  
}  
3
sunleo

これを試して:

 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);
        }

    }
1
Mawia

1つのリストをループしてから、 含む を使用して他のリストの各要素を確認します。

1
NimChimpsky

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

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

    for (Integer n : a){
     if (!b.contains(n)){
       notPresent.add(n);
     }
    }
1
Averroes

これを試して...

Listのcontains()メソッドを使用します。

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

for (Integer i : a){

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

             aList.add(i);

       }

     else{
             continue;

      }

 }
0