2017-04-14 65 views
0

搜索的對象列表中的條目,我有以下列表Java的:只有一個屬性

List<A> list= new ArrayList<>(); 

public class A{ 
private String name; 
private List<B> listB = new ArrayList<>(); } 

我現在要搜索列表中的條目由我只能通過它的名稱來識別。背景是,我得到了一個我想在listB中添加的對象。爲了使它更漂亮,我想搜索,如果已經有此名稱在A中的條目,然後添加其給予的方法有條目:

示例文本:

list: 
    name1 
     entry11 
     etnry12 
     entry13 
    name2 
     entry21 
     entry22 

Now I want to Add the following listB to listA 
    name1 
     entry14 
     entry15 

Behaviour now: 
list: 
    name1 
     entry11 
     etnry12 
     entry13 
    name2 
     entry21 
     entry22 
    name1 
     entry14 
     entry15 

Desired bahaviour: 
list: 
    name1 
     entry11 
     etnry12 
     entry13 
     entry14 
     entry15 
    name2 
     entry21 
     entry22 
+0

你的問題不清楚給我。嘗試製作一個[最小,完整和可驗證示例](https://stackoverflow.com/help/mcve)您的問題。並且知道A和B如何相關將是一件好事。 –

回答

0

爲什麼不使用Set<A>而不是List<A>,因爲name對於集合中的每個A實例都應該是唯一的?

爲了實現你的需要,你可以通過依靠的name領域覆蓋equals()hashcode()方法A

這樣,當你想從A列表與特定標籤的A與此相同的特定標籤列表添加元素,你可以創建一個A對象與預期的名稱,並從檢索這兩個列表。

這裏是一個示例代碼:

String name = "nameFromObjectWhereIWantToAddElements"; 
A aToSearch = new A(name); 

A targetA = listTarget.get(listTarget.indexOf(aToSearch)); 
A originaA = listOrigin.get(listOrigin.indexOf(aToSearch)); 

targetA.addElements(originaA.getElements()); 

你也可以使用,如果結構適合一個地圖您的需求。

0

帶有鍵值的列表具有數據結構Map。您可以使用Map來利用JavaSE API的優勢,而不是使用數組列表。

如果您使用map,則可以使用此方法執行此操作。 「一個集合是不能包含重複元素的集合。」欲瞭解更多信息,請參閱here

public static void add(Map<String, HashSet<String>> listB) { 

    for (String entry : listB.keySet()) { 
     if (listA.containsKey(entry)) { 
      listA.get(entry).addAll(listB.get(entry)); 
     } else { 
      listA.put(entry, listB.get(entry)); 
     } 
    } 
} 

注:我使用Set來刪除重複項作爲鍵的值。如果你想保持重複,你可以使用ArrayList<>()。此外,Set不保留訂單的某些暗示,並且條目的順序可能會隨時變化。

相關問題