我有一个类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.
}
我的理解对吗?
您可以以这种方式比较对象,但是有两个重要的方法可以改进您的方法。
-
人们总是按年龄分类吗?更常见的是,它们是按名字排序的。有时它们是按身高或体重排序的。如果没有唯一的固有正确的对象排序方法,通常最好使用单独的
Comparator
:Comparator<Person> BY_AGE
,Comparator<Person> BY_NAME
,等等。您可以使用这些常量(public static final
)来避免重新创建它们。 -
您的
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
类本身中,您也会发现。