2つの整数配列の交点

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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。