嗨,伙计们,我有3个收藏品,第一个我想按名字排序,第二个用于电子邮件,最后一个我想按年龄排序。我的问题是它使用集合有用吗?
如果我在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());
}
});起作用了?还是每个集合覆盖了以前的?
发布于 2017-07-26 20:21:26
如果您连续排序与操作相同的集合,则将覆盖其他排序操作的效果。
您想要的可以通过调整自定义比较器来完成。首先对名称进行比较,如果元素相等,则通过电子邮件进行比较,如果相同,则由age进行比较。
看看下面的代码片段:
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));这将产生与上文所述相同的比较器。
发布于 2017-07-26 20:21:12
如果我说对了,你应该在这里使用java-8功能.
Collections.sort(listPeople, Comparator.comparing(People::getName)
.thenComparing(People::getEmail)
.thenComparing(People::getAge));https://stackoverflow.com/questions/45336601
复制相似问题