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