可以通过自定义一个 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 的对象

java根据对象的某两个属性拼合在一起取两个对象集合的交集

原文地址: https://www.cveoy.top/t/topic/hKtc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录