2017-07-26 22 views
0

嗨,我有3个收藏, 第一个我想要按名称排序,第二个电子邮件,然后是最后一个我想排序的年龄。 我的问题是使用集合的工作?收藏排序Java

,如果我这样做在SQL像

sort by name,email,age 

我知道它的工作吗?

我试着用java这样做。

Collections.sort(listPeople, new Comparator<People>() { 
    @Override 
    public int compare(final People o1, final People o2) { 
     return o1.getName().compareTo(o2.getName()); 
    } 
}); 

//then 

Collections.sort(listPeople, new Comparator<People>() { 
    @Override 
    public int compare(final People o1, final People o2) { 
     return o1.getEmail().compareTo(o2.getEmail()); 
    } 
}); 

//and then 

Collections.sort(listPeople, new Comparator<People>() { 
    @Override 
    public int compare(final People o1, final People o2) { 
     return o1.getAge().compareTo(o2.getAge()); 
    } 
}); 

它的工作原理?或每个集合覆盖以前?

+1

为什么不尝试运行它,并告诉我们它是否可以运行 – victor

+0

类应该以单个实例命名。如果您的班级实例代表一个人,请将其命名为“人”,而不是“人”。 – shmosel

+3

你的问题有点矛盾。 SQL按名称,电子邮件,年龄排序(实际上,“按顺序排列”)对多个字段中的一组行进行排序。但是接下来你会讨论3个集合,每个集合都在一个字段上排序。然后,您的代码将一个集合排序3次。请澄清。 – Arkadiy

回答

4

如果您先后排序同一集合比操作将覆盖其他的影响排序操作。


你想要什么可以通过调整你的自定义比较器来完成。首先比较名称,如果元素相等,则比较电子邮件地址,如果再次相等,则比较年龄

看看这个代码片段:

Collections.sort(listPeople, new Comparator<People>() { 
    @Override 
    public int compare(final People o1, final People o2) { 
     int nameOrder = o1.getName().compareTo(o2.getName()); 
     if (nameOrder != 0) { 
      return nameOrder; 
     } 

     // Elements names are equal, compare by their email 
     int emailOrder = o1.getEmail().compareTo(o2.getEmail()); 
     if (emailOrder != 0) { 
      return emailOrder ; 
     } 

     // Elements emails are equal, compare by their age 
     int ageOrder = o1.getAge().compareTo(o2.getAge()); 
     // Return that in any case as we do not have another sorting criteria 
     return ageOrder; 
    } 
}); 

由于的Java 8就可以达到同样的用更少的代码(见@Eugene答案):

Comparator.comparing(People::getName) 
    .thenComparing(People::getEmail) 
    .thenComparing(People::getAge)); 

这将创建与上面解释的相同的比较器。

6

如果我得到了它是正确的,你应该使用java-8的功能在这里...

Collections.sort(listPeople, Comparator.comparing(People::getName) 
        .thenComparing(People::getEmail) 
        .thenComparing(People::getAge)); 
+0

尽管这段代码确实解决了OP的问题,但并未解释它的工作原理。对我来说,这听起来像OP与一些基础知识的斗争,可能的解释有助于更多地了解事情的工作原理,只是发布一些有用的技巧。 – Zabuza

+0

@ Zabuza ...这就是你的答案确实如此。特别是因为这是用'java-8'标记的,我假设*用户能够阅读这个“魔术代码”。嘿,我给你的答案btw一个加号,所以thx填补他的差距;) – Eugene

+0

哦,没有看到'java-8'标签,那么我肯定撤回我的反对:) – Zabuza