我读到了使用比较器对ArrayLists进行排序,但在所有示例中,人们使用 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);
...
}
24 回答
此代码段可能很有用 . 如果你想在我的情况下对Object进行排序,我想按VolumeName排序:
这很有效 . 我在我的jsp中使用它 .
You can Sort using java 8
我更喜欢这个过程:
如果对象列表中有一个名为
startDate
的属性,则可以反复使用此属性 . 你甚至可以链接他们startDate.time
.这需要您的对象为
Comparable
,这意味着您需要compareTo
,equals
和hashCode
实现 .是的,它可能会更快......但是现在你不必为每种类型的排序制作新的比较器 . 如果你可以节省开发时间并放弃运行时,你可以选择这个 .
您可以使用Bean Comparator对自定义类中的任何属性进行排序 .
使用Java 8,您可以使用比较器的方法引用:
具有自然排序顺序的类(作为示例的类Number)应该实现Comparable接口,而没有自然排序顺序的类(作为示例的类)应该与比较器(或匿名比较器)一起提供类) .
两个例子:
用法:
您的customComparator类必须实现java.util.Comparator才能使用 . 它还必须覆盖compare()AND equals()
compare()必须回答这个问题:对象1是否小于,等于或大于对象2?
完整文档:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
从1.8开始是新的List.sort()方法,而不是使用Collection.sort(),所以你直接调用mylistcontainer.sort()
这是一个演示List.sort()功能的代码片段:
Fruit类是:
} // Fruit类的结尾
使用此库here,您可以对多列上的自定义对象列表进行排序 . 该库使用8.0版功能 . 那里也有样品 . 这是一个要做的样本
由于技术每天都会出现,答案会随着时间的推移而改变 . 我看了看LambdaJ,看起来非常有趣 .
您可以尝试使用 LambdaJ 解决这些任务 . 你可以在这里找到它:http://code.google.com/p/lambdaj/
这里有一个例子:
Sort Iterative
Sort with lambda
当然,拥有这种美感会影响性能(平均2次),但是你能找到更易读的代码吗?
JAVA 8 lambda表达式
或
对于Java 8:
要么
另一种方式是
是的你可以 . 比较项目有两个选项,Comparable接口和Comparator接口 .
这两种接口都允许不同的行为 . Comparable允许您使对象的行为与刚才描述的字符串一样(实际上,String实现了Comparable) . 第二个,比较器,允许你做你要做的事情 . 你会这样做:
这将导致Collections.sort方法将比较器用于它的排序机制 . 如果ArrayList中的对象具有可比性,则可以执行以下操作:
Collections类包含许多这些有用的常用工具 .
从
Java 8
开始,我们不必直接使用Collections.sort()
.List
接口有一个默认的sort()
方法:见http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
是的,例如在this answer中我可以按类
IndexValue
的属性v
排序如果您注意到这里我正在创建一个匿名内部类(它是用于闭包的Java)并将其直接传递给类
Arrays
的sort
方法您的对象也可以实现
Comparable
('s what String and most of the core libraries in Java does ) but that would define the 427876 of the class it self, and doesn' t让您插入新的 .使用Java 8,可以使用
Comparator.comparing()
在一行中定义Comparator
使用以下任何一种方式:
Option 1:
Option 2:
要对
ArrayList
进行排序,您可以使用以下代码段:使用JAVA 8的最简单方法是英语字母排序
Class Implementation
Sort
如果要对包含非英文字符的字母进行排序,可以使用Locale ...下面的代码使用土耳其字符排序...
Class Implementation
Sort
你可以试试Guava Ordering:
您可以在2016年德国斯图加特的Java论坛上了解这个presentation .
只有少数幻灯片使用德语,99%的内容是“基于英语”的Java源代码;喜欢
其中
OurCustomComparator
正在使用默认方法(和其他有趣的想法) . 如图所示,导致非常简洁的代码来选择一些getter方法进行排序;和排序标准的超级简单链接(或逆转) .如果您使用的是java8,那么您可以找到很多材料来帮助您入门 .
Java 8 Lambda缩短了排序 .
由于Date实现Comparable,它有一个
compareTo
方法,就像String
一样 .所以你的自定义Comparator可能如下所示:
compare()
方法必须返回int
,因此您无法直接返回boolean
,就像您计划的那样 .你的排序代码就像你写的那样:
如果你不需要重用你的比较器,那么编写所有这些的稍微简短的方法就是将它写成内联匿名类:
自java-8以来
您现在可以使用lambda expression为
Comparator
以较短的形式编写最后一个示例:List
有一个sort(Comparator)方法,所以你可以进一步缩短它:这是一个常见的习惯用法,a built-in method为一个带有
Comparable
键的类生成Comparator
:所有这些都是等效的形式 .
我发现大多数(如果不是全部)这些答案都依赖于底层类(Object)来实现可比较的或具有可比较的辅助接口 .
不是我的解决方案!以下代码允许您通过了解其字符串名称来比较对象的字段 . 您可以轻松地修改它而不使用名称,但是您需要公开它或构造一个您想要比较的对象 .