2013-11-20 68 views
-1

我有两个ArrayList中再次包含硬件类型的ArrayList:的Java:比较两个的ArrayList其中包含内的ArrayList

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

类硬件中包含的ElementType枚举,其中确定硬件的类型:

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

为list1的实施例,其中包含3 ArrayList的类型的硬件:

[Microcontroller, Memory] 
[Port] 
[Pin] 

示例列表2,其中包含6 ArrayList的硬件类型:

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

现在我要检查,如果列表1中所有的ArrayList都包含在列表2,并且具有相同的顺序:

这将是有效的:

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

,而这将有不一样的秩序,因此是无效的:

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

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

我这个struggeling了一段时间,因为我不知道如何使用收集的辅助方法,这和我使用循环的第一个想法是相当差并没有帮助我:

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

任何人都可以帮助我,或给我一些方便的提示?

干杯, 菲尔

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

只是为了澄清:

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

回答

0

你知道吗,你想要什么其实很简单:

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

事实上,你也许并不需要一个单独的方法,如果是这么简单。

+0

这看起来很简单,但它不是。使用有一个ArrayList的ArrayList和比较你需要循环,然后调用containsAll –

+0

@GV你错了。通过'containsAll'将子数组列表与'equals'进行比较,这就是我们想要的。 – tbodt

+0

另外它会比较包含的对象,它们是HardwareElement的实例。两个列表都包含不同的对象,只有ElementType可以是相同的 – ph09

-1

您可以使用List#retainAll()此:

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

在路口元素(list2List#retainAll()后)的列表,你在找什么。如果两个内部列表具有相同的对象,但没有相同的顺序,则不会被视为相同,因此您不必担心这一点。

注:List#retainAll()将修改实际list1对象。如果你需要保存它,请在做这件事之前复制一份。

+0

请参阅我的答案上的评论。 – tbodt

+0

对象不一样。他们可以通过它们的ElementType(Enum)进行比较。 – ph09

+0

@ ph09可以在'Hardware'中重写'equals'吗? – tbodt