私はList<Person> persons = new ArrayList<>();
を持っていて、すべてのユニークな名前をリストしたいと思います。私は "ジョン"、 "マックス"、 "ジョン"、 "グレッグ"がある場合、 "マックス"と "グレッグ"だけをリストしたいと思います。 Javaストリームでそれを行うにはいくつかの方法がありますか?Javaストリーム - ユニークな要素を見つける
答えて
私たちはどのように多くの発生をカウントするために、ストリームやCollectors.groupingBy
を使用することができます:あなたは、単に以下に示すように、重複をフィルタリングするために、リストで要素のoccuranceをチェックする使用Collections.frequency
でき
List<String> persons = new ArrayList<>();
persons.add("John");
persons.add("John");
persons.add("MAX");
persons.add("Greg");
Set<String> set = new HashSet<String>();
Set<String> duplicateSet = new HashSet<String>();
for (String p : persons) {
if (!set.add(p)) {
duplicateSet.add(p);
}
}
System.out.println(duplicateSet.toString());
set.removeAll(duplicateSet);
System.out.println(set.toString());
これにより、重複する要素がすべて削除されます。
List<String> listInputs = new ArrayList<>();
//add your users
List<String> listOutputs = new ArrayList<>();
for(String value : listInputs) {
if(Collections.frequency(listInputs, value) ==1) {
listOutputs.add(value);
}
}
System.out.println(listOutputs);
私たちはそれぞれの名前を持っています - 複数の名前が一度だけフィルタリングされます:
List<String> res = persons.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() == 1)
.map(e -> e.getKey())
.collect(Collectors.toList());
System.out.println(res); // [Max, Greg]
最初の推測の解決策。
persons.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(entry -> entry.getValue() == 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList())
偉大な心は同じように考える... :) – alfasin
List persons = new ArrayList();
persons.add("Max");
persons.add("John");
persons.add("John");
persons.add("Greg");
persons.stream()
.filter(person -> Collections.frequency(persons, person) == 1)
.collect(Collectors.toList());
これは古い記事ですが、私は、カスタムコレクターに基づいてさらに別のアプローチを提案したいと思います。ここでは
public static <T> Collector<T, ?, List<T>> excludingDuplicates() {
return Collector.<T, Map<T, Boolean>, List<T>>of(
LinkedHashMap::new,
(map, elem) -> map.compute(elem, (k, v) -> v == null),
(left, right) -> {
right.forEach((k, v) -> left.merge(k, v, (o, n) -> false));
return left;
},
m -> m.keySet().stream().filter(m::get).collect(Collectors.toList()));
}
私はカスタムコレクタを作成するCollector.of
を使用していますLinkedHashMap
に要素を累積します。要素がキーとして存在しない場合、その値はtrue
になります。それ以外の場合はfalse
になります。マージ機能はパラレルストリームにのみ適用され、left
マップの各エントリをleft
マップに配置し、すでに存在するキーの値をfalse
に変更することで、right
マップをleft
マップにマージします。最後にフィニッシャー関数は、値がtrue
のマップのキーを含むリストを返します。次のように
この方法を使用することができます。
List<String> people = Arrays.asList("John", "Max", "John", "Greg");
List<String> result = people.stream().collect(excludingDuplicates());
System.out.println(result); // [Max, Greg]
そして、ここでは別のアプローチは、カスタムコレクタを使用するよりも簡単です:します。https://
Map<String, Boolean> duplicates = new LinkedHashMap<>();
people.forEach(elem -> duplicates.compute(elem, (k, v) -> v != null));
duplicates.values().removeIf(v -> v);
Set<String> allUnique = duplicates.keySet();
System.out.println(allUnique); // [Max, Greg]
- 1. 見つける複雑なユニークな要素
- 2. バイナリツリー内のユニークな要素を見つける
- 3. Javascriptを/ ES6ユニークな要素を見つけて、
- 4. 2つの2つのTSVファイルの間でユニークな要素を見つける
- 5. PHPで2つの配列のユニークな要素を見つけるには?
- 6. ユニークな要素のJavaコレクション
- 7. 整数のストリームで最大の要素を見つける
- 8. スカラーのマップの値の中でユニークな要素を見つける
- 9. 要素名を失うことなくリスト内のユニークな要素を見つける
- 10. Javaストリーム:2つのストリームで異なる最初のアイテムを見つける
- 11. ハイブテーブルのユニークな値を見つける
- 12. RegExユニークな単語を見つける
- 13. ユニークなトリプレットを見つける
- 14. Javaの文字列の2次元配列のユニークな要素を見つけるには?
- 15. ユニークな内容の要素を見つけ、次の要素のコンテンツを取得します
- 16. Appiumが要素を見つけるベストプラクティス
- 17. xmlを解析してJavaの要素を見つける
- 18. 見つけ、select要素
- 19. Javaで要素位置の配列を見つける
- 20. Java 8のリストから最初の要素を見つける
- 21. Javaでツールチップのスパン要素を見つける方法
- 22. セレンのwebdriver(Java)でネストされた要素を見つける
- 23. のJava 8ストリーム要素
- 24. Selenium Webdriver要素を見つける(ボタン)
- 25. 要素のターゲットを見つける
- 26. DOM要素を見つけるベストプラクティス
- 27. 複数の要素を見つける
- 28. リスト内の要素を見つける
- 29. Jquery:DIV内の要素を見つける
- 30. 要素のインデックスを見つけるC#
は、最初のいくつかの基本的な研究を行って試してみてくださいwww.google.co.uk/search?q=java%20stream%20unique –
それをストリームに集めてストリーム:)実際には、あなたがそのオーダーを気にしなければ、ただセットしてください。 – 9000
あなたの側で任意のコードの試行ですか? – MaxZoom