Java 集合交集:根据两个属性合并对象
可以通过自定义一个 Comparator 来对对象进行排序,然后使用两个指针分别指向两个集合的开头,比较两个对象的属性值,如果相等则将其添加到交集中,然后移动指针继续比较下一个对象,直到其中一个集合遍历完毕。\n\n以下是一个示例代码:\n\njava\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nclass Person {\n private String name;\n private int age;\n\n public Person(String name, int age) {\n this.name = name;\n this.age = age;\n }\n\n public String getName() {\n return name;\n }\n\n public int getAge() {\n return age;\n }\n}\n\npublic class Main {\n public static void main(String[] args) {\n List<Person> list1 = new ArrayList<>();\n list1.add(new Person("Alice", 20));\n list1.add(new Person("Bob", 25));\n list1.add(new Person("Charlie", 30));\n\n List<Person> list2 = new ArrayList<>();\n list2.add(new Person("Alice", 20));\n list2.add(new Person("David", 35));\n list2.add(new Person("Charlie", 30));\n\n Set<Person> intersection = new HashSet<>();\n\n list1.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));\n list2.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));\n\n int i = 0, j = 0;\n while (i < list1.size() && j < list2.size()) {\n Person p1 = list1.get(i);\n Person p2 = list2.get(j);\n if (p1.getName().equals(p2.getName()) && p1.getAge() == p2.getAge()) {\n intersection.add(p1);\n i++;\n j++;\n } else if (p1.getName().compareTo(p2.getName()) < 0 || (p1.getName().equals(p2.getName()) && p1.getAge() < p2.getAge())) {\n i++;\n } else {\n j++;\n }\n }\n\n for (Person person : intersection) {\n System.out.println(person.getName() + " " + person.getAge());\n }\n }\n}\n\n\n上述代码中,我们自定义了一个 Person 类,包含了 name 和 age 两个属性。然后创建了两个集合 list1 和 list2,并添加了一些 Person 对象。\n\n我们通过 Comparator 对集合进行排序,按照 name 属性进行升序排序,如果 name 相同则按照 age 属性进行升序排序。\n\n然后使用两个指针 i 和 j 分别指向两个集合的开头,比较两个对象的 name 和 age 属性值。如果相等,则将该对象添加到交集 intersection 中,并将两个指针同时向后移动一步。如果不相等,则根据属性值的大小关系移动指针继续比较下一个对象,直到其中一个集合遍历完毕。\n\n最后,我们遍历交集中的对象,并输出其 name 和 age 属性值。\n\n运行上述代码,输出结果为:\n\n\nAlice 20\nCharlie 30\n\n\n表示两个集合的交集为名字为 "Alice",年龄为 20 的对象和名字为 "Charlie",年龄为 30 的对象。
原文地址: https://www.cveoy.top/t/topic/ptxM 著作权归作者所有。请勿转载和采集!