Java:仅通过一个属性

时间:2017-04-14 09:42:50

标签: java list search arraylist

我有以下列表

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

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

我现在想要在列表中搜索一个条目,我只能通过它来识别它的名字。背景是,我得到一个A的对象,我想在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

2 个答案:

答案 0 :(得分:0)

为什么不使用Set<A>代替List<A>作为name对于集合中的每个A实例都应该是唯一的?

为了满足您的需求,您可以依靠equals()字段覆盖hashcode()中的Aname方法。

通过这种方式,当您要将具有特定标签的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());

如果结构符合您的需要,您也可以使用地图。

答案 1 :(得分:0)

包含值键的列表具有数据结构Map。您可以使用Map来获取JavaSE API的优势,而不是使用数组列表。

如果您使用地图,则可以使用此方法执行此操作。 &#34; Set是一个不能包含重复元素的Collection。&#34;有关详细信息,请参阅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不会保留订单,并且条目的顺序可能会不时变化。