在 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());
}
}
我有一个 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());
}
}