こんにちは私はこの投稿を見ましたが、2つのデータセット(文字列)がある場合に和集合と共通部分を実装する方法です。セットにオブジェクトが含まれているときに同じことを行うにはどうすればよいですか?1つのプロパティのみの和集合を取得したい各オブジェクトの?
4 に答える
しかし、選択したプロパティに同じ値を持つオブジェクトがすでにセットにある場合にオブジェクトが追加されないように、何らかの方法でそれらをオーバーライドしたいと思います。十分に明確でない場合は、例を書くことができるように教えてください。
これを行う最良の方法は、ConcurrentMapを使用することだと思います。
ConcurrentMap<String, MyType> map = new ConcurrentHashMap<>();
// the collection to retain.
for(MyType mt: retainedSet) map.put(mt.getKey(), mt);
// the collection to keep if not duplicated
for(MyType mt: onlyIfNewSet) map.putIfAbsent(mt.getKey(), mt);
// to get the intersection.
Set<String> toKeep = new HashSet<>();
for(MyType mt: onlyIfNewSet) toKeep.add(mt.getKey());
// keep only the keys which match.
map.keySet().retainAll(toKeep);
Google Guavaには、これらのメソッドやその他多くのメソッドを含むSetsクラスがあります。
交差点は、equalsを使用するcontainsを使用しています。equals()
交差させたいクラスにメソッドを実装する必要があります。
実装に関する具体的なコメントは見つかりませんでしset.addAll()
たが、おそらくequals()
オブジェクトがすでにセットにあるかどうかを判断するためにも使用されます。
フィールドのみで比較する場合、equals()はこのフィールドのみを比較する必要があります。
この回答のように、収集メソッドretainAll(Collection)
--intersectionおよび--unionを使用します#addAll(Collection)
。
これらのメソッドはequalsを使用するためequals
、クラスのメソッドをオーバーライドして、1つのプロパティベースの比較を実装する必要もあります。
簡単な比較のために、次の例を示します(私のIDEAによって生成されました)。
public class Main {
private Integer age;
...
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Main main = (Main) o;
if (age != null ? !age.equals(main.age) : main.age != null) return false;
return true;
}