【问题标题】:sorting a list name and date using comparator使用比较器对列表名称和日期进行排序
【发布时间】: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


【解决方案1】:

首先,您可以实现Comparable 而不是Comparator,这将允许您使用Collections.sort(list) 而不是Collections.sort(list, s1)

现在,就个人而言,我不喜欢更改对象的核心“可比较”要求,因为它们可能是出于某种原因以这种方式定义的,相反,我更喜欢根据即时需求创建 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

【讨论】:

  • 我的标准是我应该能够传递任何名称(在本例中为“sas”/s1)并对列表进行排序,以便传递的名称应位于列表顶部,然后是其余名称.我知道您如何对日期进行排序,我可以使用此逻辑对名称和日期进行排序。感谢您的帮助.. :)
  • 我不会以这种方式直接使用Comparator,我要做的是设计一个自定义Comparator,当它发现(name.equals(o.name) ) 它会给那个对象优先级,但这只是我;)
  • @MadProgrammer 能否请您添加一些代码,我们如何在 Java 8 中做到这一点?
  • @KickButtowski 您可以像在 Java 8 中一样使用它;) - 仅仅因为有一个“功能”并不意味着您需要用完并使用它。不是每个人都在使用 8 并且 Lambda 函数不向后兼容...
  • @MadProgrammer 真的吗?我觉得比你说的要紧凑
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 2013-02-13
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多