2013-11-20 69 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