对对象集合进行排序

2022-08-31 15:20:40

如果我有一个简单的字符串列表:

List<String> stringList = new ArrayList<String>();

我可以用以下方式排序:

Collections.sort(stringList);

但假设我有一个 Person 类:

public class Person
{
   private String name;
   private Integer age;
   private String country;
}

以及它的列表:

List<Person> personList = new ArrayList<Person>();

我想按名字排序,有时按年龄排序,有时按国家排序。

实现这一目标的最简单方法是什么?

我知道我可以实现Compable接口,但这似乎限制了我按一个特定属性对其进行排序。


答案 1

Collections.sort 可以使用自定义比较器调用。该比较器可以实现,以允许以不同的排序顺序进行排序。下面是一个示例(对于您的人员模型 - 将年龄作为整数):

public class FlexiblePersonComparator implements Comparator<Person> {
  public enum Order {Name, Age, Country}

  private Order sortingBy = Name;

  @Override
  public int compare(Person person1, Person person2) {
    switch(sortingBy) {
      case Name: return person1.name.compareTo(person2.name);
      case Age: return person1.age.compareTo(person2.age);
      case Country: return person1.country.compareTo(person2.country);
    }
    throw new RuntimeException("Practically unreachable code, can't be thrown");
  }

  public void setSortingBy(Order sortBy) {
    this.sortingBy = sortingBy;
  }
}

你这样使用它(假设人是一个字段):

public void sortPersonsBy(FlexiblePersonComparator.Order sortingBy) {
  List<Person> persons = this.persons;  // useless line, just for clarification
  FlexiblePersonComparator comparator = new FlexiblePersonComparator();
  comparator.setSortingBy(sortingBy);
  Collections.sort(persons, comparator); // now we have a sorted list
}

答案 2

实现比较器接口(每个不同的排序顺序一次),并使用将比较器作为附加参数的 Collections.sort() 方法。


推荐