【问题标题】:Merge two list (java 7)合并两个列表(java 7)
【发布时间】:2017-08-22 15:56:20
【问题描述】:

我有两个Personne 列表:listOnelistTwo

Personne 是:

public class Personne{
    private String name;
    private Favorite favorite;
    private Collection<Number>  numbers;
}

public class Favorite{
    private String id;
    private String name;
    ...
}

对于每个项目,如果第一个列表的收藏名称和 id 等于第二个列表的收藏名称和 id,我想合并两个列表,然后将第二个列表合并到第一个。

这是我的治疗的一部分,我所说的合并是什么意思(它不会创建另一个列表):

如果我的条件是真的,我想从我的第一个列表中取出项目:

item.setNumbers(item2.getnumbers);

使用 Java 7 执行此操作的最佳方法是什么?

【问题讨论】:

  • 为什么不创建一个新列表,遍历其他两个并添加它们? (接下来,您的问题上下文不正确,您说您有一个 Personne 列表,但您正在谈论列表中的收藏夹。)
  • 因为我的列表包含收藏夹而收藏夹包含其他字段。如果我的条件为真,我只想测试最喜欢的名称和 ID 我想用第二个列表的项目完成我的项目
  • 要比较收藏夹,你应该做一个equals(Object other)方法,(artima.com/lejava/articles/equality.html)但是我仍然不清楚请求的结果,你能举个例子和想要的结果?
  • 我只需要测试最喜欢的 id 和名称(最喜欢的包含其他字段),如果我的条件是真的,我想拿我的第一个列表中的项目并用第二个列表信息的项目完成它.setNumbers(item2.getnumbers).

标签: java list merge


【解决方案1】:

我会尝试遍历 listOne,检查每个所需的项目是否在 listTwo 中,在这种情况下,将 listOne 和 listTwo 中的条目添加到新列表中。

类似

https://gist.github.com/a2465b03fb7503f9c8190ab72c328c10

【讨论】:

  • 最喜欢的类包含其他字段,所以 equals 方法应该只有两个字段(name 和 id)?如果为真,我想用项目 2 的其他字段完成项目,例如: for (Personne per1:listOne){ for (Personne per2:listTwo){ if (per1.getFavorite().equals(per2.getFavorite())){ per1.setNumbers(per2.getNumbers()) listMerged.add(per1); } } } 谢谢你的回答
  • 使用 interpunction、codefor 代码和一些换行意义上的“格式化”将有助于我理解您想要做什么。
  • 我了解您只想将收藏夹列表中的numbers-property 合并到 Personne 列表中的相应 Personne 中,对吗?
  • 是的,这正是我想要的(如果第一个列表的收藏名称和 ID 等于第二个列表的收藏名称和 ID)
  • 但是我怎么能在收藏夹中实现equals方法,因为它包含其他字段但我只想要id和name?谢谢你的建议
【解决方案2】:

据我了解,我们希望得到一个列表,其中包含两个列表的所有唯一元素且不重复。

首先让我们为 ArrayList.contains() 方法正常运行所需的类创建一个 equals() 方法:

class Favorite {
    ...
    private boolean equals(Favorite other) {
        int i = id.compareTo(other.id);
        if (i != 0) return false;

        return (name.compareTo(other.name) == 0);
    }

class Personnel {
    ...
    private boolean equals(Personnel other) {
        int i = name.compareTo(other.name);
        if (i != 0) return false;

        return favorite.equals(other.favorite); 
    }

由于不能保证输入列表是有序的,我们可以这样写合并方法:

    public List<Personnel> merge(List<Personnel> listOne, List<Personnel> listTwo) {
        List<Personnel> result = new ArrayList<>(listOne);

        for (Personnel p : listTwo) {
            if (!result.contains(p)) {
                result.add(p);
            }
        }

        return result;
    }

【讨论】:

  • 我只需要测试最喜欢的 id 和 name 而不是 personne 的名字,如果我的条件是真的,我想拿我的第一个列表中的项目并用第二个列表信息的项目(如项目)完成它。 setNumbers(item2.getnumbers)。但你的回答澄清了我的想法
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2012-02-23
相关资源
最近更新 更多