在Java的列表的包装类上使用比较器强制执行顺序(不排序)

时间:2017-10-30 10:47:28

标签: java arraylist collections comparator comparable

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

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

我在这方面遇到了麻烦。我已经实现了比较方法,但是当我比较人物对象时它仍然无法工作。

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

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

我知道如何使用Comparator进行排序,这是不同的。 我完全了解其他可能的更好的解决方案(任何优先级队列类或某种排序集类)

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

3 个答案:

答案 0 :(得分:1)

您可以编写自定义j1并使用Comparator方法。

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

您的代码看起来像

compare(a, b)

答案 1 :(得分:1)

根据你的描述,你有一个像这样的Wrapper课程?

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
        }
    }
} 

哪个应该(不太确定)工作。

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

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

进行排序

答案 2 :(得分:1)

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

{{1}}