Java的:只有一个属性

问题描述:

搜索的对象列表中的条目,我有以下列表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://*.com/help/mcve)您的问题。并且知道A和B如何相关将是一件好事。 –

为什么不使用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()); 

你也可以使用,如果结构适合一个地图您的需求。

带有键值的列表具有数据结构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不保留订单的某些暗示,并且条目的顺序可能会随时变化。