我有两组不同类型的对象。一个集合中的每个元素都与另一个集合中的一个元素相关,并且两个列表属于两个不同的类。
我有一个函数可以迭代一个集合并检查是否必须删除该元素,如果需要删除,我必须删除另一集合中的关联元素。
我必须使用什么样的收集和方法才能做到这一点?
最佳答案
所描述的操作听起来很适合在 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);
}
关于java - Java中两个列表之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24728324/