按属性排序自定义对象的ArrayList

我阅读了关于使用比较器对ArrayLists进行排序的方法,但在所有使用compareTo的例子中,根据某些研究,这是针对Strings的一种方法。

我想通过它们的一个属性对自定义对象的ArrayList进行排序:Date对象( getStartDay() )。 通常我通过item1.getStartDate().before(item2.getStartDate())比较他们item1.getStartDate().before(item2.getStartDate())所以我想知道我是否可以写如下所示:

public class CustomComparator {
    public boolean compare(Object object1, Object object2) {
        return object1.getStartDate().before(object2.getStartDate());
    }
}

public class RandomName {
    ...
    Collections.sort(Database.arrayList, new CustomComparator);
    ...
}

由于Date实现了Comparable ,因此它具有与String类似的compareTo方法。

所以你的自定义Comparator可能看起来像这样:

public class CustomComparator implements Comparator<MyObject> {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
}

compare()方法必须返回一个int ,所以你不能直接返回一个boolean就像你打算的那样。

你的排序代码就像你写的:

Collections.sort(Database.arrayList, new CustomComparator());

如果你不需要重用你的比较器,那么编写所有这些的一个稍微简短的方法就是把它写成一个内联的匿名类:

Collections.sort(Database.arrayList, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
});

自java-8

您现在可以使用Comparator器的lambda表达式以较短的形式编写最后一个示例:

Collections.sort(Database.arrayList, 
                        (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

List有一个sort(Comparator)方法,所以你可以进一步缩短:

Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

这是这样一个常见的成语,有一个内置的方法来产生一个Comparator与一类Comparable关键:

Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));

所有这些都是等同的形式。


具有自然排序顺序的类(例如类Number)应该实现Comparable接口,而没有自然排序顺序的类(例如,Chair类)应该随比较器(或匿名比较器类)。

两个例子:

public class Number implements Comparable<Number> {
    private int value;

    public Number(int value) { this.value = value; }
    public int compareTo(Number anotherInstance) {
        return this.value - anotherInstance.value;
    }
}

public class Chair {
    private int weight;
    private int height;

    public Chair(int weight, int height) {
        this.weight = weight;
        this.height = height;
    }
    /* Omitting getters and setters */
}
class ChairWeightComparator implements Comparator<Chair> {
    public int compare(Chair chair1, Chair chair2) {
        return chair1.getWeight() - chair2.getWeight();
    }
}
class ChairHeightComparator implements Comparator<Chair> {
    public int compare(Chair chair1, Chair chair2) {
        return chair1.getHeight() - chair2.getHeight();
    }
}

用法:

List<Number> numbers = new ArrayList<Number>();
...
Collections.sort(numbers);

List<Chair> chairs = new ArrayList<Chair>();
// Sort by weight:
Collections.sort(chairs, new ChairWeightComparator());
// Sort by height:
Collections.sort(chairs, new ChairHeightComparator());

// You can also create anonymous comparators;
// Sort by color:
Collections.sort(chairs, new Comparator<Chair>() {
    public int compare(Chair chair1, Chair chair2) {
        ...
    }
});

为了排序ArrayList你可以使用下面的代码片段:

Collections.sort(studList, new Comparator<Student>(){
    public int compare(Student s1, Student s2) {
        return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
    }
});
链接地址: http://www.djcxy.com/p/6421.html

上一篇: Sort ArrayList of custom Objects by property

下一篇: Sort child objects while selecting the parent using LINQ