使用两个不同字段对列表进行排序的最佳方法

时间:2017-02-05 16:10:33

标签: android algorithm performance sorting collections

我有一个动物列表,其中有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。

2 个答案:

答案 0 :(得分:1)

您可以使用llm.findLastVisibleItemPosition(),但首先需要定义比较器。在你的情况下,这样的事情可能有用:

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();
    }
}

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

答案 1 :(得分:0)

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