使用比较器排序列表名称和日期

时间:2014-08-07 02:24:28

标签: java list sorting comparator

我正在尝试使用比较器实现自定义排序。到目前为止,我能够按照列表顶部指定名称的顺序对列表进行排序,其余部分如下。

代码:

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。

1 个答案:

答案 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