Java:比较两个包含内部ArrayLists的ArrayLists

时间:2013-11-20 21:48:58

标签: java algorithm collections arraylist comparison

我有两个ArrayList,它再次包含Hardware类型的ArrayLists:

private ArrayList<ArrayList<Hardware>> list1;
private ArrayList<ArrayList<Hardware>> list2;

类Hardware包含一个ElementType枚举,它确定硬件的类型:

enum ElementType{
    Microcontroller;
    Core;
    Memory;
    Sensor;
    Pin;
    Port;
}

list1的示例,其中包含3个类型为Hardware的ArrayList:

[Microcontroller, Memory]
[Port]
[Pin]

list2的示例,其中包含6个类型为Hardware的ArrayList:

[Microcontroller, Memory]
[Microcontroller, Memory]
[Microcontroller, Port]
[Microcontroller, Core]
[Sensor]
[Pin]

现在我想检查列表1中的所有ArrayList是否都包含在list2中并且具有相同的顺序:

这是有效的:

[Microcontroller, Memory, Core] == [Microcontroller, Memory, Core]

虽然这个订单不一样,因此无效:

[Microcontroller, Memory, Core] == [Microcontroller, Core, Memory]

最后,我需要知道list1的所有ArrayList在list2中是否也是相同的顺序,list2中的哪一个是它。

我已经捣乱了一段时间,因为我不知道如何使用Collection的辅助方法来实现这一点,而且我对使用循环的第一个想法非常糟糕并没有帮助我:

private void check() {
    for (ArrayList<Hardware> listOf1 : list1) {
        for (Hardware abstHw : listOf1) {
            System.out.println(abstHw);
                    ????????????
        }
    }   
}

任何人都可以帮我这个或给我一些方便的提示吗?

干杯, 菲尔

------------------编辑---------------

只是为了澄清:

list1和list2的硬件实例不一样!它们只能通过ElementType进行比较。

2 个答案:

答案 0 :(得分:0)

你知道,你想要的实际上非常简单:

private void check() {
    return list2.containsAll(list1);
}

事实上,如果这很简单,你可能不需要单独的方法。

答案 1 :(得分:-1)

您可以使用List#retainAll()

private ArrayList<ArrayList<Hardware>> list1;
private ArrayList<ArrayList<Hardware>> list2;
list2.retainAll(list1);

交叉点中的元素列表(list2之后的List#retainAll())是您正在寻找的。如果两个内部列表具有相同的对象,但顺序不同,则不会被视为相同,因此您没有明确担心这一点。

注意:List#retainAll()将修改实际的list1对象。如果您需要保留它,请在执行此操作之前进行复制。