按属性对数组自定义对象的列表进行排序从 java-8 开始

2022-08-31 03:56:55

我读到过关于使用比较器对ArrayList进行排序的文章,但在人们使用的所有例子中,根据一些研究,这是字符串的一种方法。compareTo

我想按自定义对象的一个属性对 ArrayList 进行排序:Date 对象 ()。通常我会比较它们,所以我想知道我是否可以写这样的东西:getStartDay()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);
    ...
}

答案 1

由于 Date 实现了可比性,因此它有一个类似方法的方法。compareToString

因此,您的自定义比较器可能如下所示:

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

该方法必须返回 一个 ,因此您无论如何都不能直接返回您计划的那样。compare()intboolean

您的排序代码将就像您编写的那样:

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

现在,您可以通过对以下各项使用 lambda 表达式,以较短的形式编写最后一个示例:Comparator

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

并且有一个排序(比较器)方法,所以你可以进一步缩短它:List

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

这是一个非常常见的习语,有一个内置的方法可以为具有键的类生成一个:ComparatorComparable

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

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


答案 2

具有自然排序顺序的类(例如,类编号)应实现可比较接口,而没有自然排序顺序的类(例如,类 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) {
        ...
    }
});

推荐