当前位置: 首页 > 知识库问答 >
问题:

Java合并2个集合,同时根据特定字段比较和保留对象

太叔俊侠
2023-03-14
class Object {
  string name;
  Time date;
  string createdBy;
  int version;
}

我如何合并两组对象,如果Set1中的一个对象具有匹配的名称版本作为Set2中的一个对象,那么在合并后的集合中只保留Set2中的一个。

例如。

Set1:{Object1(名称:wilson,日期:00:00:00,createdBy:admin,版本:1),Object2(名称:wilson,日期:00:00:00,createdBy:admin,版本:2)}

Set2:{Object3(名称:亚利桑那州,日期:00:00:00,创建人:用户,版本:5),Object4(名称:威尔逊,日期:00:00:00,创建人:用户,版本:1)}

生成的合并集:{Object4(名称:wilson,日期:00:00:00,createdBy:user,版本:1),Object2(名称:wilson,日期:00:00:00,createdBy:admin,版本:2),Object3(名称:arizona,日期:00:00:00,createdBy:user,版本:5),(顺序无关紧要)

我可以联合这两个集合但我不知道如何利用Java8流添加此过滤条件

共有1个答案

汪臻
2023-03-14

如果你认为你的对象是相等的,如果名字和版本是相同的,那么你可以定义为你的相等性测试(即重写<代码>等于<代码/代码>和<代码> hash码< /代码>在你的类中)。

如果将该条件定义为相等,则只需将集合存储在一个集合中:

Set<Object> mergedSet = new HashSet(set2);
mergedSet.addAll(set1);

请注意,我首先添加了set2,以便那里的对象优先。

如果这是一种特殊情况,通常不能代表相同的对象,则:

Set<Object> mergedSet = new HashSet(set2);
set1.stream()
    .filter(o1 -> set2.stream()
        .noneMatch(o2 -> o1.name.equals(o2.name) && o1.version == o2.version))
    .forEach(mergedSet::add);
 类似资料:
  • 这是我在java中所能做的最好的操作,但它收集的是唯一的名称,而不是狗: (狗包含除名称以外的其他字段) 还能改进吗?还有其他更好的解决方案或优化方法吗?

  • 我想将至少2个PDF文件合并为一个,同时保留原始PDF中的所有表单元素。表单元素包括文本字段、单选按钮、复选框、下拉菜单等。请查看此示例PDF文件的表单: 你能做到吗? 编辑:至于实现,我更希望在linux平台上使用开源工具(如'ghostscript'或任何其他您认为适合解决此任务的工具)的命令行解决方案。 当然,欢迎每个人提供解决这个问题的任何工作解决方案,包括一个编码解决方案,它涉及编写一个

  • 问题内容: 我有以下收藏: 当这个样子的: 现在我必须根据字段对集合进行排序,如何实现呢? 问题答案: 这是我的“ 1班轮”: Java 8的更新:对于int数据类型 甚至: 对于String数据类型(如注释中所示) ..它期望吸气剂

  • 问题内容: 当给出两套时 s1 = {a,b,c,d} s2 = {b,c,d,a} (IE) 如何编写Sql查询以显示“ tableA和tableB中的元素相等”。[不使用SP或UDF] 输出 问题答案: 使用: 测试:

  • 问题内容: 我有2个月的2个数据集,包括学生的姓名和分数。 我需要提供每个学生的2月分数,以及他/她2月分数的变化百分比。 我可以使用Java集合吗? 样本数据集: 输出应该是这样的 (名称:约翰,2月分数:80,百分比变化:100) (名称:玛丽,2月的分数:81,百分比变化:32.76) (名称:吉姆,2月的分数:82,百分比变化:57.69) (名称:利兹,2月的分数:84 ,百分比变化:N

  • 我有以下方案的数据: 我想从这些数据中计算出几个聚合字段,并具有以下模式: 在RDD的快乐日子里,我可以使用,定义{ip-的映射 在Dataset/Dataframe聚合中不再可用,而是可以使用UDAF,不幸的是,从我使用UDAF的经验来看,它们是不可变的,这意味着它们不能使用(必须在每次映射更新时创建一个新实例)示例解释在这里 一方面,从技术上讲,我可以将数据集转换为RDD、聚合等,然后返回数据