在 Java 中的列表的包装器 class 上使用比较器强加顺序(不排序)

impose order (not sorting) using comparator on a wrapper class of a list in Java

我有一个 class 人。它有年龄、姓名、身高等。 我正在创建一个名为 PersonCollection 的 class,它是一个列表(ArrayList)的包装器。

我希望能够使用 PersonCollection class 比较 Person 对象,这意味着,我不想让 Person class 实现 Comparable 接口,我想要PersonCollection 实现 Comparator 接口。

我无法做到这一点。我已经实现了比较方法,但是当我比较 Person 对象时它仍然不起作用。

例如这段代码给我一个错误(people 是一个 ArrayList

public void insert (Person p){
    for(int i = 0; i < people.size(); i++){
        if (people.get(i) > p){
            //Do something
        }
    }
} 

我知道怎么用Comparator来排序,这个不一样。 我完全了解其他可能的和可能更好的解决方案(任何优先级队列 class 或某种排序集 classes)

出于特定原因,我希望为 ArrayList 这样做,我恳请您将解决方案基于此,而不是建议其他数据结构。

您可以编写自定义 Comparator 并使用 compare(a, b) 方法。

https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-T-T-

你的代码看起来像

if (myComparator.compare(people.get(i), p) > 0 ) {

根据您的描述,您有这样的包装器 class?

public class People implements List<Person>, Comparator<Person>{
    /* methods */
}

所以如果你想真正使用比较器接口,那么你必须这样做:

public void insert (Person p){
    for(int i = 0; i < people.size(); i++){
        if (people.compare(people.get(i),p)){ // because people implements Comparator
            //Do something
        }
    }
} 

哪个应该(虽然不太确定)有效。

但我强烈建议不要使用它并考虑更好的东西,因为 class 不应该是比较器和列表(因为两个接口应该用于完全不同的原因)。

更好的方法是让 Person 实现 Comparable,然后根据

进行排序

下面是一段代码,您可以在其中看到自定义比较器正在对 Person 对象的年龄属性进行年龄比较。

   public class TestCompare {

    public static void main(String[] args) {
        Person person1 = new Person(45, "Tom");
        Person person2 = new Person(12, "Sarah");
        Person person3 = new Person(34, "Michael");
        Person person4 = new Person(33, "Donald");
        Person person5 = new Person(65, "timothy");
        List<Person> people = new ArrayList<Person>();
        people.add(person1);
        people.add(person2);
        people.add(person3);
        people.add(person4);
        people.add(person5);

        CustomComparator comparator=new CustomComparator();

        for (Person p : people) {
            System.out.println(comparator.compare(p, new Person(55, "James")));
        }
    }

}

class CustomComparator implements Comparator<Person> {



    @Override
    public int compare(Person o1, Person o2) {
        // TODO Auto-generated method stub
        return o1.getAge().compareTo(o2.getAge());
    }


}

class Person implements Comparable<Person> {

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;

    }

    @Override
    public int compareTo(Person o) {
        // TODO Auto-generated method stub
        return this.getAge().compareTo(o.getAge());
    }

}