在Java中,使用comparator对列表的包装类施加顺序(而不是排序)

在Java中,使用comparator对列表的包装类施加顺序(而不是排序),java,arraylist,collections,comparator,comparable,Java,Arraylist,Collections,Comparator,Comparable,我有一门课,一个人。它有年龄、名字、身高等。 我正在创建一个名为PersonCollection的类,它是列表(ArrayList)的包装器 我希望能够使用PersonCollection类比较Person对象,这意味着,我不想让Person类实现Comparable接口,我希望PersonCollection实现Comparator接口 我做那件事有困难。我已经实现了compare方法,但是当我比较Person对象时,它仍然不起作用 例如,这段代码给了我一个错误(people是ArrayLis

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

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

我做那件事有困难。我已经实现了compare方法,但是当我比较Person对象时,它仍然不起作用

例如,这段代码给了我一个错误(people是ArrayList)
public void insert (Person p){
    for(int i = 0; i < people.size(); i++){
        if (people.get(i) > p){
            //Do something
        }
    }
} 
公共作废插入(p人){
for(inti=0;ip){
//做点什么
}
}
} 
我知道如何使用比较器进行排序,这是不同的。 我完全了解其他可能更好的解决方案(任何优先级队列类或某种sortedset类)


出于特定原因,我希望对ArrayList执行此操作,并恳请您将解决方案建立在此基础上,而不是建议其他数据结构。

您可以编写自定义的
比较器
并使用
比较(a,b)
方法

你的代码看起来像

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

您可以编写自定义的
比较器
并使用
比较(a,b)
方法

你的代码看起来像

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

根据您的描述,您有这样的包装器类吗

public class People implements List<Person>, Comparator<Person>{
    /* methods */
}
公共类人员实现列表、比较器{
/*方法*/
}
因此,如果您想真正使用comparator接口,那么您必须这样做:

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
        }
    }
} 
公共作废插入(p人){
for(inti=0;i
这应该(不太确定)起作用

但我强烈建议不要使用它,而是考虑一些更好的方法,因为类不应该是一个比较器和一个列表(因为两个接口的使用原因完全不同)


更好的方法是使
Person
实现
可比较
,然后根据该排序

根据您的描述,您有这样的包装器类吗

public class People implements List<Person>, Comparator<Person>{
    /* methods */
}
公共类人员实现列表、比较器{
/*方法*/
}
因此,如果您想真正使用comparator接口,那么您必须这样做:

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
        }
    }
} 
公共作废插入(p人){
for(inti=0;i
这应该(不太确定)起作用

但我强烈建议不要使用它,而是考虑一些更好的方法,因为类不应该是一个比较器和一个列表(因为两个接口的使用原因完全不同)


更好的方法是使
Person
实现
可比性
,然后根据该排序下面是一段代码,您可以看到自定义比较器正在对Person对象的age属性进行年龄比较

   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());
    }

}
公共类TestCompare{
公共静态void main(字符串[]args){
Person person1=新人(45,“汤姆”);
Person person2=新人(12,“莎拉”);
Person person3=新人(34,“迈克尔”);
Person person4=新人(33,“唐纳德”);
Person person5=新人(65,“timothy”);
List people=new ArrayList();
添加(person1);
添加(person2);
添加(person3);
添加(person4);
添加(person5);
CustomComparator comparator=新CustomComparator();
用于(人员p:人员){
System.out.println(comparator.compare(p,新人(55,“詹姆斯”));
}
}
}
类CustomComparator实现Comparator{
@凌驾
公共整数比较(o1人、o2人){
//TODO自动生成的方法存根
返回o1.getAge().compareTo(o2.getAge());
}
}
类人实现可比性{
公众人物(整数年龄,字符串名称){
这个。年龄=年龄;
this.name=名称;
}
私人整数年龄;
私有字符串名称;
公共整数getAge(){
回归年龄;
}
公共无效设置(整数期限){
这个。年龄=年龄;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@凌驾
公共内部比较(o人){
//TODO自动生成的方法存根
返回这个.getAge().compareTo(o.getAge());
}
}

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

   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());
    }

}
公共类TestCompare{
公共静态void main(字符串[]args){
Person person1=新人(45,“汤姆”);
Person person2=新人(12,“莎拉”);
Person person3=新人(34,“迈克尔”);
Person person4=新人(33,“唐纳德”);
Person person5=新人(65,“timothy”);
List people=new ArrayList();
添加(person1);
添加(person2);
添加(person3);
添加(person4);
添加(person5);
CustomComparator comparator=新CustomComparator();
用于(人员p:人员){
System.out.println(comparator.compare(p,新人(55,“詹姆斯”));
}
}
}
类CustomComparator实现Comparator{
@凌驾
公共整数比较(o1人、o2人){
//TODO自动生成的方法存根
返回o1.getAge().compareTo(o2.getAge());
}
}
类人实现可比性{
公众人物(整数年龄,字符串名称){
这