如何对arraylist执行一系列排序操作(多个排序标准)

时间:2011-11-21 13:09:50

标签: java sorting collections arraylist comparator

我有一个对象的arrayList,我想在这个列表上运行一系列的排序操作。我想首先按名称对它们进行排序,如果两个名称相同,则按id排序,例如。

我该如何实施呢?

这是我的代码

Comparator<Ticket> mc;
mc = new TicketIdComparator();
Collections.sort(tickets, mc);


final class TicketIdComparator implements Comparator<Ticket>

{

    @Override
    public int compare(Ticket ticket1, Ticket ticket2) {
        String TicketId1 = ((Ticket) ticket1).getNumber();
        String TickedId2 = ((Ticket) ticket2).getNumber();

        int num1=Integer.parseInt(TicketId1);
        int num2 =Integer.parseInt(TickedId2);

        if (num1<num2)
            return 1;
        if (num1>num2)
            return -1;
        return 0;



    }
}

这个代码排序列表由id完成,但我想再次排序name

6 个答案:

答案 0 :(得分:5)

您可以从一组比较器中编写一个比较器。

public static <T extends Comparable<T>> Comparator<T> comparatorFrom(final Comparator<T>... comparators) {
    return new Comparator<T>() {
        @Override
        public int compare(T o1, T o2) {
            for (Comparator<T> comparator : comparators) {
                final int cmp = comparator.compare(o1, o2);
                if (cmp != 0) return cmp;
            }
            return 0;
        }
    };
}

// you can then use
Arrays.sort(list, comparatorFrom(comp1, comp2, comp3, comp4));

答案 1 :(得分:3)

  Collections.sort(myList, new Comparator() {

     @Override
     public int compare(Object o1, Object o2)
     {
        // write your ordering code here
        return 0;
     }

  });

只需填写您想要的比较代码,Java就会为您处理排序。

修改更新的问题:

Comparator<Ticket> mc;
mc = new TicketIdComparator();
Collections.sort(tickets, mc);


final class TicketIdComparator implements Comparator<Ticket>

{

    @Override
    public int compare(Ticket ticket1, Ticket ticket2) {
        String TicketId1 = ((Ticket) ticket1).getNumber();
        String TickedId2 = ((Ticket) ticket2).getNumber();

        int num1=Integer.parseInt(TicketId1);
        int num2 =Integer.parseInt(TickedId2);

        if (num1<num2)
            return 1;
        else if (num1>num2)
            return -1;
        else
            return ticket1.getName().compare(ticket2.getName());
    }
}

答案 2 :(得分:2)

正如您所说的,与您编写的代码类似,您将创建一个实现Ticket的Comparator接口的类。首先,使用字符串比较器比较票证的名称,如果这导致0(相同的名称),那么您将在同一比较器中通过id进行比较。

确保字符串比较器之前进行修剪(在空格之前和之后删除)并且可能忽略套管,这取决于您。

如果你想要某种泛化,那么你可以编写一个装饰器比较器来调用更具体的那些。如果您想了解更多相关信息,请与我们联系。

答案 3 :(得分:1)

Collections.sort(myList,new Comparator(){

 @Override
 public int compare(Object o1, Object o2)
 {
    // write your ordering code here for sorting list by id
    return 0;
 }

});

按ID排序的列表

Collections.sort(myList,new Comparator(){

 @Override
 public int compare(Object o1, Object o2)
 {
    // write your ordering code here for sorting list by name
    return 0;
 }

});

它将给出按名称排序的列表

答案 4 :(得分:1)

使用Java 8,您可以使用 lambdas ,根据Peter Lawrey的回答,您可以做一些漂亮的事情:

        Collections.sort(users, comparatorFrom(

                    (final User u1, final User u2) -> u1.getDomain().getFirstName()
                        .compareTo(u2.getFirstName()),

                    (final User u1, final User u2) -> u1.getLastName().compareTo(u2.getLastName()),

                    ...more comparators here...

               ));

答案 5 :(得分:0)

您需要使用稳定的排序算法,然后按ID排序,然后按名称排序。

查看this comparison of algorithms以找到符合您需求的产品。