【问题标题】:Java: Searching for an entry in a List of Objects only by one attributeJava:仅按一个属性在对象列表中搜索条目
【发布时间】:2017-04-14 09:42:49
【问题描述】:

我有以下列表

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

【问题讨论】:

标签: java list search arraylist


【解决方案1】:

为什么不使用Set&lt;A&gt; 而不是List&lt;A&gt;,因为name 对于集合中的每个A 实例都应该是唯一的?

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

这样,当您想将具有特定标签的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());

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

【讨论】:

    【解决方案2】:

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

    如果您使用地图,您可以使用此方法执行此操作。 “一个集合是一个不能包含重复元素的集合。”更多信息请参考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&lt;&gt;()。此外,Set 不会因为某些含义而保持顺序,并且条目的顺序可能会不时改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 2011-03-17
      • 2011-07-08
      • 2013-03-09
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多