我正在尝试使用比较器实现自定义排序。到目前为止,我能够按照列表顶部指定名称的顺序对列表进行排序,其余部分如下。
代码:
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。
答案 0 :(得分:4)
首先,您可以实施Comparable
而不是Comparator
,这样您就可以使用Collections.sort(list)
代替Collections.sort(list, s1)
。
现在,就个人而言,我不喜欢改变核心&#34;可比的&#34;对象的要求,因为它们可能是出于某种原因而被定义的,相反,我喜欢根据直接需要创建Comparator
,例如..
Collections.sort(list, new Comparator<SortingTest>() {
@Override
public int compare(SortingTest o1, SortingTest o2) {
int result = o1.name.compareTo(o2.name);
if (result == 0) {
result = o1.date.compareTo(o2.date);
} else {
result = -result;
}
return result;
}
});
这基本上会比较每个SortingTest
个实例的名称,如果它们是0
,则会使用Date
来确定差异。
然后输出类似......
的内容Sas Thu Aug 07 12:30:11 EST 2014
Sas Mon Aug 11 12:30:11 EST 2014
Meina Sun Aug 10 12:30:11 EST 2014
Jabir Sat Aug 09 12:30:11 EST 2014
Dave Fri Aug 08 12:30:11 EST 2014