我可以使用对象的 compareTo 方法对作为该对象的属性的列表进行排序吗?



我有一个类Person,它有一个属性ArrayList孩子;

我想访问并遍历子元素。有时我需要按孩子的年龄排序,从最大的到最小的,但并不总是这样。当我确实需要这样做时,我将需要在许多地方对许多对象进行操作,因此我不需要每次都使用新的Comparators进行操作是有道理的。

那么最好通过为Person类创建一个compareTo(Person o)来完成这一点,然后当我想在main()中迭代排序的子列表时,我做如下操作:

方法:

public class Person implements Comparable<Person> {
// This is in the Person class as a method.
@Override
public int compareTo(Person o) {
if (this.age == o.getAge()) {
return 0;   
} else if (this.age < o.getAge()){
return 1; // Because we want to go from largest to smallest.
} else {
return -1;
}
}
}

当我需要访问代码中person的每个子节点并从那里访问时:

Collections.sort(person.getChildren());
for (Person child: person.getChildren()){
// Whatever needs to be done.
}

我的理解对吗?

可以以这种方式比较对象,但是有两个重要的方法可以改进您的方法。

  1. 人们总是按年龄分类吗?更常见的是,它们是按名字排序的。有时它们是按身高或体重排序的。如果没有唯一的固有正确的对象排序方法,通常最好使用单独的Comparator:Comparator<Person> BY_AGE,Comparator<Person> BY_NAME,等等。您可以使用这些常量(public static final)来避免重新创建它们。

  2. 您的compareTo提供了正确的逻辑,但您可以通过使用Integer.compareTo来简化它。更好的是,您可以这样编写比较器:Comparator.comparingInt(Person::getAge).

总的来说,代码看起来像这样:

public class Person {
public static final Comparator<Person> BY_AGE = Comparator.comparingInt(Person::getAge);
...
}

children字段是哪个类的成员并不重要。重要的是children字段本身的类型

由于该字段是Person的列表,因此排序它需要Person类来实现Comparable接口,这正是您所做的,所以您会很好。事实上,即使您将ArrayList<Person> children字段保留在其他类中而不是在Person类本身中,您也会发现。

相关内容

  • 没有找到相关文章

最新更新