我读过关于使用比较器对数组列表进行排序的文章,但在所有示例中,人们都使用了compareTo
,根据一些研究,这是一种用于字符串的方法。
我希望按照自定义对象的属性之一对其ArrayList进行排序:日期对象(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);
...
}
具有自然排序顺序(例如类号)的类应实现可比接口,而没有自然排序顺序(例如类椅)的类应提供比较器(或匿名比较器类)。
两个例子:
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) {
...
}
});
由于date
实现了comparable
,因此它具有一个compareto
方法,就像string
一样。
因此,您的自定义比较器
可能如下所示:
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());
}
});
现在可以通过使用比较器
的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()));
这是一个非常常见的习惯用法,因此有一个内置方法可以为具有comparable
键的类生成comparator
:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
这些都是等价的形式。
问题内容: 如何根据自定义属性排序ArrayList中的对象? 问题答案: 从实现,它就有一个像方法一样的方法。 因此,你的自定义设置应如下所示: 该方法必须返回一个,因此无论如何你都无法直接返回一个你计划中的。 你的排序代码几乎就像你写的那样: 如果你不需要重用比较器,则编写所有这些内容的一种更短的方法是将其编写为内联匿名类: 自从Java-8 现在,你可以通过使用lambda表达式来以较短的形
要做到这一点,最干净的捷径是什么? 我知道它可以通过自定义比较器来实现。对于这种情况,难道没有现成的东西吗? 有点像这样:
假设我们有一个名为的自定义类,该类包含两个属性: 其中许多存储在一个阵列中: 如何按“fileID”升序或降序对图像数组进行排序?
我试过了,但不起作用,二进制运算符'>'不能应用于两个'double?‘操作数 做这件事最方便快捷的方法是什么?
问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。
我正在写一个Java的应用程序,它应该读取每行记录的输入文件,字段由逗号分隔。应用程序的输出应在stdout上,格式如下: 等等 我创建了一个类Person来保存数据,并实现了可比接口,该接口对年龄进行主要排序,对性别进行次要排序。我可以稍后在名称上添加三级排序。 接下来,在main方法的App类中,我创建了一个ArrayList,填充了数据,并使用Collections.sort()进行排序。我