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
答
为什么不使用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不保留订单的某些暗示,并且条目的顺序可能会随时变化。
你的问题不清楚给我。尝试制作一个[最小,完整和可验证示例](https://*.com/help/mcve)您的问题。并且知道A和B如何相关将是一件好事。 –