我在添加java泛型的过程中遇到了这个旧代码,我不明白这里发生了什么,需要改变什么。
static void sortByDate( List list) throws Exception
{
class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
RQEntry o11 = (RQEntry) o1;
RQEntry o22 = (RQEntry) o2;
int cc = ((String)o11.getHandledDate() ).compareTo(o22.getHandledDate() );
return (cc < 0 ? -1 : cc > 0 ? 1 : 0);
}
};
Collections.sort(list, new MyComparator());
}
问题1 :有人可以解释这种方法如何进行比较吗?
问题2 :应该传递哪些泛型类型参数以符合Java 5标准?
问题3 :如何通过创建compare
的新实例来调用MyComparator
方法?
更新
刚刚找到这个链接,最终帮助我理解了这段代码:http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html
答案 0 :(得分:1)
如果您有List<RQEntry>
,可以使用此比较器对其进行排序
RQEntry
对象将根据其处理日期进行比较。
这就是这里的调用。
Collections.sort(list, new MyComparator());
在幕后,当排序算法需要比较时
两个RQEntry对象,它将调用你的compare
方法
比较。就是这样。
答案 1 :(得分:1)
答案1:它正在对getHandleDate方法返回的内容进行字符串比较。我不知道它为什么这样做:
return (cc < 0 ? -1 : cc > 0 ? 1 : 0);
因为cc应该通过所有权限为-1,0或1.代码可以很容易地执行:
return ((String)o11.getHandledDate()).compareTo(o22.getHandledDate());
答案2:您可以使用泛型来简化如下:
static void sortByDate(List<RQEntry> list) throws Exception
{
Collections.sort(list, new Comparator<RQEntry> {
public int compare(RQEntry o1, RQEntry o2) {
return ((String)o1.getHandledDate()).compareTo(o2.getHandledDate());
}
});
}
答案 2 :(得分:1)
此代码允许您按日期对List
进行排序。它假设List
实际上是List<RQEntry>
。
Java允许您致电Collections.sort(list, new SomeComparator())
。您在第二个参数中指定的比较器包含决定如何对列表中的项目进行排序的代码。
实际比较界面是您需要实施int compare(Object o1, Object o2)
。根据规范,如果两个对象相同则需要返回0
,如果第二个项目在第二个项目之前排序则返回负值,如果第二个项目在第一个项目之前排序则返回正值。
例如,如果您有一个包含[37, 19]
的列表,则调用compare(37, 19)
将返回1
(假设您要按升序对整数列表进行排序)。
答案 3 :(得分:0)
Question 1: Could someone explain how this method performs comparison?
对于每个对象,调用getHandledDate()
方法并比较返回值(显然String
s)(默认比较是lexicograhical排序。
棘手的部分是理解所使用的String.compareTo
方法的返回值。它在Comparable interface。
Question 2: What generic type parameters should be passed to comply with Java 5 standards?
泛型类型显然应该是RQEntry
。 - &GT; class MyComparator implements Comparator<RQEntry>
。
另见: