【问题标题】:Best way to sort a list using two different fields使用两个不同字段对列表进行排序的最佳方法
【发布时间】:2023-03-09 20:57:01
【问题描述】:

我有一个动物列表,其中有 3 种类型 TIGER、DOG、ANT,它们还有一个字段确定需要排序的顺序

public class Animal {
    private final AnimalType animalType;

    private final int orderNumber;

    public Animal(AnimalType animalType, int orderNumber) {
        this.animalType = animalType;
        this.orderNumber = orderNumber;
    }

    public int getOrderNumber() {
        return orderNumber;
    }

    public AnimalType getAnimalType() {
        return animalType;
        }
    }


    public enum AnimalType {
        TIGER("tiger"),
        DOG("dog"),
        ANT("ant");
    }

列表需要先TIGER再DOG再ANT排序,而且每个Animal都有一个顺序号

如果我们有这个:

List<Animal> animals = new ArrayList<>();

animals.add(new Animal(TIGER, 2));
animals.add(new Animal(DOG, 5));
animals.add(new Animal(ANT, 1));
animals.add(new Animal(ANT, 3));
animals.add(new Animal(TIGER, 3));
animals.add(new Animal(DOG, 4));
animals.add(new Animal(TIGER, 1));
animals.add(new Animal(DOG, 2));
animals.add(new Animal(DOG, 1));
animals.add(new Animal(ANT, 2));
animals.add(new Animal(DOG, 3));

排序后应该是这样的

new Animal(TIGER, 1);
new Animal(TIGER, 2);
new Animal(TIGER, 3);
new Animal(DOG, 1);
new Animal(DOG, 2);
new Animal(DOG, 3);
new Animal(DOG, 4);
new Animal(DOG, 5);
new Animal(ANT, 1);
new Animal(ANT, 2);
new Animal(ANT, 3);

最好的排序方法是什么?我使用的是 Android,所以它应该是 Java 7。

【问题讨论】:

标签: android algorithm performance sorting collections


【解决方案1】:

您可以使用Collections.sort,但首先您需要定义一个比较器。在您的情况下,这样的事情可能会起作用:

class AnimalCompare implements Comparator<Animal> {
    @Override
    public int compare(Animal o1, Animal o2) {
        if (o1.getAnimalType().ordinal() < o2.getAnimalType().ordinal()){
            return -1;
        } else if (o1.getAnimalType().ordinal() > o2.getAnimalType().ordinal()) {
            return 1;
        }
        return o1.getOrderNumber() - o2.getOrderNumber();
    }
}

然后:

Collections.sort(animals, new AnimalCompare());

请注意,这都是假设没有空值。

【讨论】:

    【解决方案2】:

    尝试为 Collections.sort() 方法定义一个比较器,或者让动物类实现 Comparable 接口并覆盖 compareTo(Animal animal) 方法,你应该会很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-11
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 2015-05-10
      相关资源
      最近更新 更多