この記事ではListで重複するデータを取り除く方法をわかりやすく解説します!
Listにデータを追加する際に重複しないようにしたい
Listから重複するデータを削除する方法はいくつもあるの?
Java8の新機能を使って簡潔に重複する要素を削除したい
今回はそんな悩みを解決する要素が重複しないListの作り方についてです。
なお、Javaの記事については、こちらにまとめています。
HashSetを使って重複しないListを作る方法
ArrayList等で値が重複しないListを作ろうとすると自分で処理を書かなければならずとても面倒です。
しかし、HashSetを使うことでList内の重複しているデータを削除することが可能です!
HashSetの使い方を覚えるために次のプログラムを見てみましょう。
import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; public class Main { public static void main(String[] args) throws Exception { List<String> listA = new ArrayList<String>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); List<String> listB = new ArrayList<String>(new HashSet<>(listA)); System.out.println("ListA = " + listA); System.out.println("ListB = " + listB); } }
[実行結果]
ListA = [s, a, m, u, r, a, i] ListB = [a, r, s, u, i, m]
このようにHashSetを使うことでListAの重複する文字列の”a”が一つ削除されたListBができました!
実行結果からわかるように、HashSetを使うと要素の並び順が変わります。
要素の並び順を変えたくない場合は、次のようにLinkedHashSetを使います。
import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; public class Main { public static void main(String[] args) throws Exception { List<String> listA = new ArrayList<String>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); List<String> listB = new ArrayList<String>(new LinkedHashSet<>(listA)); System.out.println("ListA = " + listA); System.out.println("ListB = " + listB); } }
[実行結果]
ListA = [s, a, m, u, r, a, i] ListB = [s, a, m, u, r, i]
このようにLinkedHashSetを使うことで要素の並び順を変えずに重複している要素を削除することができます。
Java8でStreamAPIを使う方法
最後にStreamAPIとdistinctメソッドを使った方法を解説します。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) throws Exception { List<String> listA = new ArrayList<String>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); List<String> listB = listA.stream().distinct().collect(Collectors.toList()); System.out.println("ListA = " + listA); System.out.println("ListB = " + listB); } }
[実行結果]
ListA = [s, a, m, u, r, a, i] ListB = [s, a, m, u, r, i]
この方法でも並び順を変えずに重複する要素を削除することができました!
ここではStreamAPIを使って、distinctメソッドで重複した要素を削除した後にcollect(Collectors.toList())でListに戻しています。
StreamAPIはJava8から追加されたデータの操作を簡単に行えるようにする機能です。
StreamAPIについては次の記事で詳しく解説しています!
まとめ
いかがでしたか?
今回はListから重複するデータを取り除く方法を解説しました。StreamAPIはListを便利に扱うことができるようになるのでぜひ覚えてください。
もし重複する要素のないListを作る方法を忘れてしまったらこの記事を確認してくださいね!