我有两组不同类型的对象。一组中的每个元素与另一组中的一个元素相关,并且这两个列表分为两个不同的类。
我有一个迭代一个集合的函数,并检查是否必须删除此元素,当它出现时,我必须删除另一个集合中的关联元素。
我必须使用哪种收集方法?
答案 0 :(得分:1)
所描述的操作听起来非常适合在Java中使用Set
(不是List
)。例如:
// s1 contains the set {1, 4, 5, 3}
Set<Integer> s1 = new HashSet<Integer>();
s1.add(1); s1.add(4); s1.add(5); s1.add(3);
// s2 contains the set {1, 2, 3}
Set<Integer> s2 = new HashSet<Integer>();
s2.add(1); s2.add(2); s2.add(3);
// perform the difference between s1 and s2
s1.removeAll(s2);
// now s1 contains the set {4, 5}
System.out.println(s1);
=> [4, 5]
<强>更新强>
如果两个集合都包含不同类型的元素,那么您必须设计一种方法将一种类型转换为另一种类型,或者将其放入问题中:找到“另一组中的关联元素”。这可以是一个简单的转换,或者可能是Map
以这样的方式保存关系:给定第一个集合的元素,您可以快速从第二个集合中获取相应的元素。例如,如果转换足够:
Set<Integer> s1 = new HashSet<Integer>();
s1.add(1); s1.add(4); s1.add(5); s1.add(3);
Set<String> s2 = new HashSet<String>();
s2.add("1"); s2.add("2"); s2.add("3");
for (String s : s2) {
// find "associated element"
Integer n = Integer.valueOf(s);
if (s1.contains(n))
s1.remove(n);
}
如果无法进行简单转换,则计划B将定义元素之间的映射:
Set<Integer> s1 = new HashSet<Integer>();
s1.add(1); s1.add(4); s1.add(5); s1.add(3);
Set<String> s2 = new HashSet<String>();
s2.add("1"); s2.add("2"); s2.add("3");
// map the equivalences from one set into the other
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("1", 1);
map.put("2", 2);
map.put("3", 3);
for (String s : s2) {
// find "associated element"
Integer n = map.get(s);
if (s1.contains(n))
s1.remove(n);
}
答案 1 :(得分:1)
如果您不担心性能,请选择Set
提供的解决方案。请注意,它有Om^2
时间复杂度。
正如评论中所提到的,有一种方法可以使用Map
来实现它,它将为您提供Om
解决方案(取决于它的实现方式)。
class Relationship<T, V> {
final T o1;
final V o1;
public Relationship(o1, o2) {
this.o1 = o1;
this.o2 = o2;
}
}
Map<String, Relationship> relationship = new Map<>;
// create the relationships add it to the Map instead to a List
relations.put("id12", new Relationship(o1, o2));
relations.put("id34", new Relationship(o3, o4));
// ...
// iterate over `relationships` and remove if its necessary.