Java中两个列表之间的关系

时间:2014-07-14 01:05:19

标签: java

我有两组不同类型的对象。一组中的每个元素与另一组中的一个元素相关,并且这两个列表分为两个不同的类。

我有一个迭代一个集合的函数,并检查是否必须删除此元素,当它出现时,我必须删除另一个集合中的关联元素。

我必须使用哪种收集方法?

2 个答案:

答案 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.