1. 序章

このクイックチュートリアルでは、学習しますリストから重複する要素をクリーンアップする方法。 最初にプレーンなJava、次にGuava、最後にJava8Lambdaベースのソリューションを使用します。

このチュートリアルは、ここBaeldungの「Java –BacktoBasic」シリーズの一部です。

2. プレーンJavaを使用してリストから重複を削除する

Set を使用して、標準のJavaコレクションフレームワークを使用してリストから重複要素を簡単に削除できます。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesWithPlainJava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates = new ArrayList<>(
      new HashSet<>(listWithDuplicates));

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
}

ご覧のとおり、元のリストは変更されていません。

上記の例では、順序付けされていないコレクションであるHashSet実装を使用しました。 その結果、クリーンアップされたlistWithoutDuplicatesの順序は、元のlistWithDuplicatesの順序と異なる場合があります。

順序を保持する必要がある場合は、代わりにLinkedHashSetを使用できます。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesPreservingOrderWithPlainJava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates = new ArrayList<>(
      new LinkedHashSet<>(listWithDuplicates));

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInRelativeOrder(5, 0, 3, 1, 2));
}

3. Guavaを使用してリストから重複を削除する

Guavaを使用しても同じことができます。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesWithGuava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates 
      = Lists.newArrayList(Sets.newHashSet(listWithDuplicates));

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
}

ここでも、元のリストは変更されていません。

この場合も、クリーンアップされたリスト内の要素の順序はランダムである可能性があります。

LinkedHashSet 実装を使用する場合、最初の順序を保持します。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesPreservingOrderWithGuava_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates 
      = Lists.newArrayList(Sets.newLinkedHashSet(listWithDuplicates));

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInRelativeOrder(5, 0, 3, 1, 2));
}

4. Java8Lambdaを使用してリストから重複を削除する

最後に、Java8でLambdasを使用した新しいソリューションを見てみましょう。 Stream APIのdistinct()メソッドを使用します。は、 equals()メソッドによって返された結果に基づいて個別の要素で構成されるストリームを返します。

さらに、順序付けられたストリームの場合、個別の要素の選択は安定しています。 これは、重複した要素の場合、遭遇順序で最初に表示される要素が保持されることを意味します。

public void 
  givenListContainsDuplicates_whenRemovingDuplicatesWithJava8_thenCorrect() {
    List<Integer> listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
    List<Integer> listWithoutDuplicates = listWithDuplicates.stream()
     .distinct()
     .collect(Collectors.toList());

    assertThat(listWithoutDuplicates, hasSize(5));
    assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
}

これで、リストからすべての重複アイテムをクリーンアップする3つの簡単な方法があります。

5. 結論

この記事では、プレーンJava、Google Guava、およびJava8を使用してリストから重複を削除することがいかに簡単であるかを示しました。

これらすべての例とスニペットの実装は、GitHubプロジェクトにあります。 これはMavenベースのプロジェクトであるため、インポートと実行が簡単である必要があります。