web-dev-qa-db-ja.com

Java 2つのリストの比較

2つのリストがあります(Javaリストではなく、2つの列を言うことができます)

例えば

**List 1**            **Lists 2**
  milan                 hafil
  dingo                 iga
  iga                   dingo
  elpha                 binga
  hafil                 mike
  meat                  dingo
  milan
  elpha
  meat
  iga                   
  neeta.peeta    

同じ要素の数を返すメソッドが必要です。この例では、3になり、リストと異なる値の両方で同様の値が返されます。

はいの場合、ハッシュマップを使用する必要がありますか?

助けてください

追伸:学校の宿題ではありません:)

84
user238384

編集

2つのバージョンがあります。 1つはArrayListを使用し、もう1つはHashSetを使用します

それらを比較し、必要なものが得られるまで、これからownバージョンを作成します。

これは以下をカバーするのに十分なはずです:

P.S:学校の課題ではありません:)だから、あなたが私を案内するだけで十分だとしたら

あなたの質問の一部。

元の回答を続ける:

そのためにJava.util.CollectionJava.util.ArrayListを使用できます。

retainAll メソッドは次のことを行います。

指定されたコレクションに含まれるこのコレクションの要素のみを保持

このサンプルを参照してください。

import Java.util.Collection;
import Java.util.ArrayList;
import Java.util.Arrays;

public class Repeated {
    public static void main( String  [] args ) {
        Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"));
        Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo"));

        listOne.retainAll( listTwo );
        System.out.println( listOne );
    }
}

編集

2番目の部分(同様の値)には、 removeAll メソッドを使用できます。

指定されたコレクションにも含まれているこのコレクションの要素をすべて削除します。

この2番目のバージョンでは、同様の値とハンドルが(破棄することで)繰り返されます。

今回はCollectionSetの代わりにListになる可能性があります(違いは、セットは繰り返し値を許可しないことです)

import Java.util.Collection;
import Java.util.HashSet;
import Java.util.Arrays;

class Repeated {
      public static void main( String  [] args ) {

          Collection<String> listOne = Arrays.asList("milan","iga",
                                                    "dingo","iga",
                                                    "elpha","iga",
                                                    "hafil","iga",
                                                    "meat","iga", 
                                                    "neeta.peeta","iga");

          Collection<String> listTwo = Arrays.asList("hafil",
                                                     "iga",
                                                     "binga", 
                                                     "mike", 
                                                     "dingo","dingo","dingo");

          Collection<String> similar = new HashSet<String>( listOne );
          Collection<String> different = new HashSet<String>();
          different.addAll( listOne );
          different.addAll( listTwo );

          similar.retainAll( listTwo );
          different.removeAll( similar );

          System.out.printf("One:%s%nTwo:%s%nSimilar:%s%nDifferent:%s%n", listOne, listTwo, similar, different);
      }
}

出力:

$ Java Repeated
One:[milan, iga, dingo, iga, elpha, iga, hafil, iga, meat, iga, neeta.peeta, iga]

Two:[hafil, iga, binga, mike, dingo, dingo, dingo]

Similar:[dingo, iga, hafil]

Different:[mike, binga, milan, meat, elpha, neeta.peeta]

必要なことを正確に行わない場合は、ここから処理できるように良いスタートを切ることができます。

読者への質問:すべての繰り返し値をどのように含めますか?

153
OscarRyz

intersection() および subtract()CollectionUtils のメソッドを試すことができます。

intersection()メソッドは、共通の要素を含むコレクションを提供し、subtract()メソッドは、一般的でない要素をすべて提供します。

彼らはまた、同様の要素の世話をする必要があります

32
Mihir Mathuria

これらは本当に リスト (順序付き、重複あり)、または セット (順序なし、重複なし)ですか?

後者の場合、たとえば Java.util.HashSet<E> を使用し、便利な retainAll を使用して予想される線形時間でこれを実行できるためです。

    List<String> list1 = Arrays.asList(
        "milan", "milan", "iga", "dingo", "milan"
    );
    List<String> list2 = Arrays.asList(
        "hafil", "milan", "dingo", "meat"
    );

    // intersection as set
    Set<String> intersect = new HashSet<String>(list1);
    intersect.retainAll(list2);
    System.out.println(intersect.size()); // prints "2"
    System.out.println(intersect); // prints "[milan, dingo]"

    // intersection/union as list
    List<String> intersectList = new ArrayList<String>();
    intersectList.addAll(list1);
    intersectList.addAll(list2);
    intersectList.retainAll(intersect);
    System.out.println(intersectList);
    // prints "[milan, milan, dingo, milan, milan, dingo]"

    // original lists are structurally unmodified
    System.out.println(list1); // prints "[milan, milan, iga, dingo, milan]"
    System.out.println(list2); // prints "[hafil, milan, dingo, meat]"
9

Java 8 removeIfの使用

public int getSimilarItems(){
    List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta");
    List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection
    int initial = two.size();

    two.removeIf(one::contains);
    return initial - two.size();
}
4

2つのコレクションの等価性をテストする便利な方法を探している場合は、org.Apache.commons.collections.CollectionUtils.isEqualCollectionを使用できます。これは、順序に関係なく2つのコレクションを比較します。

2
snowfox

List Compare でリスト比較の非常に基本的な例を見つけました。この例では、最初にサイズを検証してから、別のリストの特定の要素の可用性を確認します。

1
Manoj Kumar

hash1およびhash2を想定

List< String > sames = whatever
List< String > diffs = whatever

int count = 0;
for( String key : hash1.keySet() )
{
   if( hash2.containsKey( key ) ) 
   {
      sames.add( key );
   }
   else
   {
      diffs.add( key );
   }
}

//sames.size() contains the number of similar elements.
1
Stefan Kendall

シンプルなソリューション:-

    List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "d", "c"));
    List<String> list2 = new ArrayList<String>(Arrays.asList("b", "f", "c"));

    list.retainAll(list2);
    list2.removeAll(list);
    System.out.println("similiar " + list);
    System.out.println("different " + list2);

出力:-

similiar [b, c]
different [f]
1
Vijay Gupta

すべてのアプローチの中で、org.Apache.commons.collections.CollectionUtils#isEqualCollectionを使用するのが最善のアプローチであることがわかりました。理由は次のとおりです-

  • 追加のリストを宣言する必要はありません/自分で設定する
  • 入力リストを変更していません
  • とても効率的です。 O(N)複雑度の等価性をチェックします。

Apache.commons.collectionsを依存関係として使用できない場合は、効率がよいため、リストの等価性をチェックするために、従うアルゴリズムを実装することをお勧めします。

0
shakhawat