Javaのリストで重複を特定する
この投稿では、Javaのリストで重複を識別する方法について説明します。
1.使用する Set
簡単な解決策は、リスト内のすべての値を反復処理し、各要素をに挿入することです HashSet
。現在の要素がすでにセットに存在する場合、それは重複しています。新しいリストで見つかったすべての重複を収集できます。
これは、Java8Streamを使用して簡単に実行できます。ソリューションはの戻り値を使用することに注意してください Set.add()
値がセットにすでに存在するかどうかを判断する方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; class Main { private static <T> Set<T> findDuplicates(List<T> list) { Set<T> seen = new HashSet<>(); return list.stream() .filter(e -> !seen.add(e)) .collect(Collectors.toSet()); } public static void main(String[] args) { List<Integer> values = List.of(1, 3, 2, 3, 4, 1); Set<Integer> duplicates = findDuplicates(values); System.out.println(duplicates); } } |
出力:
[1, 3]
上記のコードは、次のコードと同等です(Java 7以下の場合)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import java.util.HashSet; import java.util.List; import java.util.Set; class Main { private static <T> Set<T> findDuplicates(Iterable<T> iterable) { Set<T> duplicates = new HashSet<>(); Set<T> seen = new HashSet<>(); for (T t : iterable) { if (!seen.add(t)) { duplicates.add(t); } } return duplicates; } public static void main(String[] args) { List<Integer> values = List.of(1, 3, 2, 3, 4, 1); Set<Integer> duplicates = findDuplicates(values); System.out.println(duplicates); } } |
出力:
[1, 3]
2.使用する Collections.frequency()
方法
最も簡単な方法は、おそらく各リスト要素の頻度をカウントして、それが重複しているかどうかを判断することです。あなたは使用することができます Collections.frequency()
このためのメソッド。コレクション内の要素の数を返します。
StreamAPIを使用したコードは次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; class Main { private static <T> Set<T> findDuplicates(List<T> list) { return list.stream().distinct() .filter(i -> Collections.frequency(list, i) > 1) .collect(Collectors.toSet()); } public static void main(String[] args) { List<Integer> values = List.of(1, 3, 2, 3, 4, 1); Set<Integer> duplicates = findDuplicates(values); System.out.println(duplicates); } } |
出力:
[1, 3]
これは、次のことと同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; class Main { private static <T> Set<T> findDuplicates(List<T> list) { Set<T> set = new HashSet<>(); for (T i : list) { if (Collections.frequency(list, i) > 1) { set.add(i); } } return set; } public static void main(String[] args) { List<Integer> values = List.of(1, 3, 2, 3, 4, 1); Set<Integer> duplicates = findDuplicates(values); System.out.println(duplicates); } } |
出力:
[1, 3]
3.使用する Collectors.groupingBy()
関数
上記のソリューションは、 Collections.frequency()
リストの各要素のメソッド。より良い解決策は、頻度マップを作成し、それを使用して要素が複製されているかどうかを判断することです。次のJava8ソリューションは、Streamsを使用して、頻度が1を超えるアイテムをフィルタリングします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; class Main { private static <T> Set<T> findDuplicates(List<T> list) { Map<T, Long> frequencyMap = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); return frequencyMap.keySet().stream() .filter(key -> frequencyMap.get(key) > 1) .collect(Collectors.toSet()); } public static void main(String[] args) { List<Integer> values = List.of(1, 3, 2, 3, 4, 1); Set<Integer> duplicates = findDuplicates(values); System.out.println(duplicates); } } |
出力:
[1, 3]
これで、Javaのリストで重複を特定できます。