【问题标题】:Cant figure out how to sort list by these criteria无法弄清楚如何按这些标准对列表进行排序
【发布时间】:2017-03-31 01:17:54
【问题描述】:

基本上我有一个对象的数组列表,这些对象具有名称和 startDate,它们的初始顺序与:

弗兰克 10/20/1990

1990 年 1 月 2 日法案

弗兰克 1990 年 2 月 2 日

约翰 9/8/1990

1990 年 4 月 4 日法案

弗兰克 1990 年 5 月 1 日

我正在尝试对它们进行排序,以便对于声明的每个新客户名称,所有具有相同名称的客户对象都必须按日期的升序彼此相邻放置,因此最终排序列表应如下所示:

弗兰克 1990 年 1 月 1 日

弗兰克 1990 年 5 月 1 日

弗兰克 10/20/1990

1990 年 1 月 2 日法案

1990 年 4 月 4 日法案

约翰 9/8/1990

我已经尝试了几个小时,但无济于事,希望有人能帮助我提前谢谢!

【问题讨论】:

  • 您使用什么语言?如果是 Java,则考虑使用排序集合。
  • 是的,我正在使用 java,你能指导我如何使用它来对我的列表进行排序
  • 开始日期是实际的Date 对象,还是文本?
  • 这是一个日期对象,它是一个日期,您可以将两个日期与 getTime 进行比较,为了简单起见,我在问题中写了该格式,而不是带有小时和分钟的正确格式,对此感到抱歉
  • @FrankBilliams 将来,用编程语言标记您的问题。

标签: java sorting arraylist collections


【解决方案1】:

Java collections framework 没有排序列表,因此此答案为您提供了一种对给定未排序列表进行排序的方法。如果您想真正维护一个排序的集合,那么您可以查看SortedSet 之类的东西,例如TreeSet

您可以为包含名称和日期的类定义一个自定义比较器(我们称之为Wrapper),然后使用它对列表进行排序:

public static Comparator<Wrapper> wrapperComparator
                      = new Comparator<Wrapper>() {

    public int compare(Wrapper w1, Wrapper w2) {
        if (w1 == null && w2 == null) {
            return -0;
        }
        else if (w1 == null && w2 != null) {
            return 1;
        }
        else if (w1 != null && w2 == null) {
            return -1;
        }
        else if (w1.getName().equals(w2.getName()) {
            return w1.getDate().compareTo(w2.getDate());
        }
        else {
            return w1.getName().compareTo(w2.getName());
        }
    }
};

现在使用此自定义比较器通过Collections.sort 实用程序对您的列表进行排序。

Collections.sort(yourList, wrapperComparator);

请注意,我在这里做了一些假设。我假设您的列表可能有空值,在这种情况下,我将空值视为 大于 比任何其他值。我还假设给定的Wrapper 对象永远不会有空名称或日期。如果不是这种情况,您必须在上面的代码中添加一些空检查。

【讨论】:

  • 谢谢!但这并没有保持原始名称声明的顺序,而是按字母顺序对事物进行排序
  • original name declarations ...在您的问题中,这些信息在哪里给出,甚至描述在哪里?如果您不想按字母顺序排序,那么您必须指定您希望如何对数据进行排序。
  • 对不起,我的措辞有点糟糕,但在最初的问题中,我写出了原始列表以及最终列表将如何,您可以看到,因为 Frank 是第一个宣布的名字,所以我必须获取以 Frank 作为名称的所有对象,并按日期顺序对它们进行排序,然后由于 Bill 是原始列表中声明的下一个唯一名称,我需要获取所有 Bill 的名称,将它们按日期顺序排序,然后那么 John 是下一个声明的唯一名称,等等。
  • 获得这个需要一些工作。此外,尚不清楚这个额外的排序是否应该与包装类相关联。也许其他人可以给你代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多