【发布时间】:2014-09-30 03:31:16
【问题描述】:
我正在尝试使用比较器实现自定义排序。到目前为止,我能够按照指定名称在列表顶部的顺序对列表进行排序,其余的紧随其后。
代码:
public class SortingTest implements Comparator<SortingTest> {
String name;
Date date;
public SortingTest(String name, Date date) {
this.name = name;
this.date = date;
}
@Override
public int compare(SortingTest o1, SortingTest o2) {
if (this.name.equals(o2.name)) {
return 1;
}
return 0;
}
public static void main(String[] args) {
List<SortingTest> list = new ArrayList<SortingTest>();
Calendar cl = Calendar.getInstance();
Date d = cl.getTime();
SortingTest s1 = new SortingTest("Sas", d);
cl.add(Calendar.DATE, 1);
Date d1 = cl.getTime();
SortingTest s2 = new SortingTest("Dave", d1);
cl.add(Calendar.DATE, 1);
Date d2 = cl.getTime();
SortingTest s3 = new SortingTest("Jabir", d2);
cl.add(Calendar.DATE, 1);
Date d4 = cl.getTime();
SortingTest s5 = new SortingTest("Meina", d4);
cl.add(Calendar.DATE, 1);
Date d5 = cl.getTime();
SortingTest s6 = new SortingTest("Sas", d5);
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s5);
list.add(s6);
Collections.sort(list, s1);
System.out.println("After sorting");
for (SortingTest st : list) {
System.out.println(st.name);
}
}
}
当前代码输出:
Sas
Sas
Dave
Jabir
Meina
但我想先按名称排序列表,然后按日期排序。所以输出应该是:
Sas, 8/6/2015
Sas, 14/6/2015
Dave, 8/6/2015
Jabir, 10/6/2015
Meina, 11/6/205
更新 1:
我的标准是我应该能够传递任何名称(在本例中为“sas”/s1)并对列表进行排序,以便传递的名称应位于列表顶部,然后是其余名称。所以在上面的例子中,我将一个对象 s1 传递给了 collection.sort 方法。 s1 保存名称“sas”,在比较方法中,我正在检查列表中的任何其他元素是否具有名称“sas”,然后给出值 1(列表顶部)或 0,如果不是。
【问题讨论】:
-
当前代码输出???你确定那是你得到的输出吗?您的预期结果也未排序。
-
如果名称相同,则按日期比较
-
如果先按姓名排序,“Dave”不应该排在“Sas”之前吗?
-
您是否应该比较 o1 和 o2 而不是 this 和 o2?
-
我已将对象 s1 传递给 collection.sort 方法。 s1 保存名称“sas”,在比较方法中,我正在检查列表中的任何其他元素是否具有名称“sas”,然后给出值 1(列表顶部)或 0,如果不是。我还更新了帖子以更加清晰。谢谢
标签: java list sorting comparator