针对集合元素排序,在项目中还是比较常见,最近因为项目中有遇到,总结如下:
对List元素排序实现方法大家都知道用Collections.sort();首先给大家介绍一下Comparable与Comparator的接口的区别。
1.Comparable是对象内部需要实现的接口,如果一个对象要想用利用Array.sort进行排序,那么这个对象必须实现Comparable的接口,比较的实现规则是在对象的内部进行的,然后直接调用Collections.sort()即可。
2.Comparator接口是在对象外实现的接口,主要是方便了对没有实现Comparable接口的对象的比较和排序,比如:当我们对已经有的 一个类进行排序的时候,这个类又没有实现Comparable接口,那么我们可以利用Collections.sort(list,mew Comparator<?>(){})来排序,同时实现一个 Comparator接口实现对这个类的排序。
以下两个例子分别详细说明:实现对User类先按照名字字母先后顺序排序,名字相同情况下,再按照年龄大小排序
测试代码如下:
1、在对象内部实现具体的排序规则
User类:
public class User implements Comparable<Object>{
//年龄
private Integer age;
//名字
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//排序方法内部实现
@Override
public int compareTo(Object o) {
User user = (User)o;
//step1、先按照名字字母顺序排序
if(this.getName() != null && user.getName() != null
&& 0 != this.getName().compareTo(user.getName())){
return this.getName().compareTo(user.getName());
}else{
//step2、 针对名字相同的再按照然后按照年龄大小排序
if (this.getAge() != null && user.getAge() != null) {
return this.getAge() - user.getAge();
}
return 0;
}
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestUserSort {
public TestUserSort(){
}
//sort实现按照名字、年龄大小排序
public static List<User> sortUser(){
List<User> userList = new ArrayList<User>();
String[] nameArry = {"ab","ccddd","ab","cd","faaa","ab"};
Integer[] ageArry = {3,6,9,4,7,1};
for(int i=0;i<6;i++){
User user = new User();
user.setName(nameArry[i]);
user.setAge(ageArry[i]);
userList.add(user);
}
return userList;
}
public static void main(String[] args){
List<User> userList = sortUser();
Collections.sort(userList);
for(User us : userList){
System.out.println(us.getName()+"的年龄是:"+us.getAge());
}
}
}
2、在对象外部实现具体的排序规则(推荐使用)
User类:
public class User{
//年龄
private Integer age;
//名字
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Comparator;
public class TestUserSort {
public TestUserSort(){
}
//sort实现按照名字、年龄大小排序
public static List<User> sortUser(){
List<User> userList = new ArrayList<User>();
String[] nameArry = {"ab","ccddd","ab","cd","faaa","ab"};
Integer[] ageArry = {3,6,9,4,7,1};
for(int i=0;i<6;i++){
User user = new User();
user.setName(nameArry[i]);
user.setAge(ageArry[i]);
userList.add(user);
}
return userList;
}
public static void main(String[] args){
List<User> userList = sortUser();
Collections.sort(userList, new Comparator<User>(){
public int compare(User o1,User o2){
//step1、先按照名字字母顺序排序
if(o1.getName() != null && o2.getName() != null
&& 0 != o1.getName().compareTo(o2.getName())){
return o1.getName().compareTo(o2.getName());
}else{
//step2、 针对名字相同的再按照然后按照年龄大小排序
if (o1.getAge() != null && o2.getAge() != null) {
return o1.getAge() - o2.getAge();
}
return 0;
}
}
});
for(User us : userList){
System.out.println(us.getName()+"的年龄是:"+us.getAge());
}
}
}
两种方法运行结果:
ab的年龄是:1
ab的年龄是:3
ab的年龄是:9
ccddd的年龄是:6
cd的年龄是:4
faaa的年龄是:7