无法弄清楚如何按这些标准对列表进行排序

时间:2017-03-31 01:17:54

标签: java sorting arraylist collections

基本上我有一个具有name和startDate的对象的arraylist,它们的初始顺序类似于:

Frank 10/20/1990

Bill 1/2/1990

Frank 2/2/1990

John 9/8/1990

Bill 4/4/1990

Frank 5/1/1990

我试图对它们进行排序,以便对于声明的每个新客户名称,所有具有相同名称的客户对象必须按其日期的升序排列在彼此旁边,因此最终排序列表应该看起来像:

Frank 1/1/1990

Frank 5/1/1990

Frank 10/20/1990

Bill 1/2/1990

Bill 4/4/1990

John 9/8/1990

我一直想弄清楚几个小时无济于事,希望有人可以提前帮助我!

1 个答案:

答案 0 :(得分: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对象永远不会有空名称或日期。如果不是这种情况,您必须在上述代码中添加一些空检查。