我有一个对象的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
答案 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以找到符合您需求的产品。