如何执行2个列表的联合?

时间:2013-03-29 14:28:58

标签: java data-structures collections arraylist

我有两个ArrayLists ar1和ar2。

ArrayList ar1包含一个对象列表,每个对象都有属性ID,NAME和STATUS。 ArrayList ar2包含一个对象列表,每个对象具有属性ID,NAME和SUBJECT。 ar1和ar2的大小都相同。

有什么方法可以将两个列表合并到一个新列表ar3中,其中包含一个对象列表,每个对象都有属性ID,NAME,STATUS和SUBJECT?

更新:两个列表中的ID和NAME相同。

4 个答案:

答案 0 :(得分:5)

public static void main(String[] args) throws Exception {

    List<String> list1 = new ArrayList<String>(Arrays.asList("A", "B", "C"));
    List<String> list2 = new ArrayList<String>(Arrays.asList("B", "C", "D",
            "E", "F"));
    List<String> result = new ArrayList<String>();
    result = union(list1, list2);

    System.out.println(result);
}

public static List<String> union(List<String> list1, List<String> list2) {
    HashSet<String> set = new HashSet<String>();

    set.addAll(list1);
    set.addAll(list2);

    return new ArrayList<String>(set);
}

输出:

[D, E, F, A, B, C]

答案 1 :(得分:2)

Map<String, Target> map = new HashMap<>();

for (TypeWithStatus item : typesWithStatus) {
   map.put(item.getId()+item.getName(), createTypeWithStatusAndSubject(item));
}

for (TypeWithSubject item : typesWithSubject) {
   map.get(item.getId()+item.getName()).setSubject(item.getSubject());
}

我们的想法是将第一个列表中的所有元素存储在地图中,并在第二次运行中更新地图值。这仅适用于两个列表在id + name方面包含“相同”项目的情况。如果没有,您将不得不添加空检查。

答案 2 :(得分:1)

所以,如果我理解正确,你有一个A列表和一个大小相同的B列表,你想要一个C列表,其中第n个element是列表a的第n个元素和列表B的第n个元素的并集。

好吧,首先你需要定义你的联合类:

class C {
    Integer id;
    String name;
    String status;
    String subject;

    C(A a, B b) {
        this.id = a.id;
        this.name = a.name;
        this.status = a.status;
        this.subject = b.subject;
    }
}

然后,您可以使用迭代器:

Iterator<A> aIterator = aList.iterator();
Iterator<B> bIterator = bList.iterator();
List<C> cList = new ArrayList(aList.size());
while (aIterator.hasNext() && bIterator.hasNext()) {
    A a = aIterator.next();
    B b = bIterator.next();
    cList.add(new C(a, b));
}

答案 3 :(得分:0)

使用带比较器C的搜索功能。

将比较器定义如下

if(obja.id==objb.id & obja.name=objb.name) return (a==b);

因此,对于listA中的每个元素,在listB中找到元素,然后构建新对象并添加

在listC中。