2つの整数配列間の交差
1. 概要
このクイックチュートリアルでは、compute the intersection between two Integer arrays ‘a'と‘b'の方法を見ていきます。
また、重複するエントリを処理する方法にも焦点を当てます。
実装には、Streams.を使用します
2. 配列のメンバーシップ述語
2つのセットの共通部分は、定義上、1つからのすべての値を持つセットであり、2つ目のセットの一部でもあります。
したがって、2番目の配列のメンバーシップを決定するには、FunctionまたはPredicateが必要です。 Listはこのようなメソッドをすぐに提供するため、これをListに変換します。
Predicate isContainedInB = Arrays.asList(b)::contains;
3. 交差点の構築
結果の配列を構築するために、最初のセットの要素を順番に検討し、それらが2番目の配列にも含まれているかどうかを確認します。 次に、これに基づいて新しい配列を作成します。
Stream APIは、必要なメソッドを提供します。 First, we’ll create a Stream, then filter with the membership-Predicate and finally we’ll create a new array:
public static Integer[] intersectionSimple(Integer[] a, Integer[] b){
return Stream.of(a)
.filter(Arrays.asList(b)::contains)
.toArray(Integer[]::new);
}
4. 重複するエントリ
Javaの配列はSetの実装ではないため、入力と結果のエントリが重複するという問題に直面します。 結果の出現回数は、最初のパラメーターの出現回数に依存することに注意してください。
ただし、セットの場合、要素は複数回出現してはなりません。 We can archive this by using the distinct() method:
public static Integer[] intersectionSet(Integer[] a, Integer[] b){
return Stream.of(a)
.filter(Arrays.asList(b)::contain)
.distinct()
.toArray(Integer[]::new);
}
そのため、交点の長さはパラメーターの順序に依存しなくなりました。
ただし、二重エントリを削除するため、配列とそれ自体の共通部分は再び配列にならない場合があります。
5. マルチセット交差
複数の等しいエントリを許可するより一般的な概念は、マルチセットです。 それらの場合、交差は最小の入力オカレンスによって定義されます。 したがって、membership-Predicateは、結果に要素を追加する頻度をスコアに保つ必要があります。
これにはremove()メソッドを使用できます。これにより、メンバーシップが返され、要素が消費されます。 したがって、‘b'のすべての等しい要素が消費された後、結果に等しい要素は追加されません。
public static Integer[] intersectionSet(Integer[] a, Integer[] b){
return Stream.of(a)
.filter(new LinkedList<>(Arrays.asList(b))::remove)
.toArray(Integer[]::new);
}
Arrays APIは不変のList,のみを返すため、専用の可変のものを生成する必要があります。
6. 結論
この記事では、containsメソッドとremove メソッドを使用して、Javaで2つの配列の共通部分を実装する方法を説明しました。
すべての実装、コードスニペット、テストはGithub repositoryにあります。これは、Mavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。