排序主要分为三种情况
1.【内部排序】使用Comparable通过implements通过implements Comparable<Object>接口override compareTo方法实现
return值 0表示相等 1表示大于 -1表示小于
2.【外部排序】通过Comparator实现
3.以上1 2条针对的都是自定义类,而java对Integer String等已经实现了排序接口Comparable,直接Collections.sort(List)使用即可
public final class Integer extends Number implements Comparable<Integer> {
//.....
}
三种情况的示例代码如下:
/**
* @author huangweiyue
* @description Comparable 【内部排序】, 通过implements Comparable<Object>接口override compareTo方法实现
* @date Created in 2019-06-28
*/
public class ComparableTest {
public static void main(String[] args) {
List<Person> list=new ArrayList<Person>();
Person test1=new Person(66,"李四");
Person test2=new Person(29,"王五");
Person test3=new Person(28,"赵六");
Person test4=new Person(20,"钱三");
list.add(test4);
list.add(test3);
list.add(test2);
list.add(test1);
Collections.sort(list);
for(Object s:list){
System.out.println(s);
}
}
}
class Person implements Comparable<Person>{
public int age; //年龄
public String name; //姓名
//get、set方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
//实现Comparable接口必须实现compareTo方法 比较规则自己实现
@Override
public int compareTo(Person person) {
if(this.age==person.getAge()){
return 0;
}else if(this.age>person.getAge()){
return 1;
}else {
return -1;
}
}
}
输出:
Person [age=20, name=钱三]
Person [age=28, name=赵六]
Person [age=29, name=王五]
Person [age=66, name=李四]
/**
* @author huangweiyue
* @description Comparator方式进行比较 【外部排序】 不需要实现Comparable接口 无法修改实体类时,直接在调用方创建
* @date Created in 2019-06-28
*/
public class ComparatorTest {
public static void main(String[] args) {
List<Emp> list = new ArrayList<>();
Emp test1 = new Emp(69, "李四");
Emp test2 = new Emp(29, "王五");
Emp test3 = new Emp(28, "赵六");
Emp test4 = new Emp(20, "钱三");
list.add(test4);
list.add(test3);
list.add(test2);
list.add(test1);
Collections.sort(list, (o1, o2) -> {
if (o1.age == o2.age && o1.name == o2.name) {
return 0;
} else if (o1.age > o2.age) {
return 1;
} else {
return 0;
}
});
for (Object s : list) {
System.out.println(s);
}
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Emp {
public int age;
public String name;
}
输出:
Emp(age=20, name=钱三)
Emp(age=28, name=赵六)
Emp(age=29, name=王五)
Emp(age=69, name=李四)
/**
* @author huangweiyue
* @version v1.0
* @task
* @description List<Integer> 排序测试 Integer已经默认实现了排序接口
* @date Created in 2019-06-28
* @modifiedBy
*/
public class ListIntegerComparableTest {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(4);
list.add(55);
list.add(66);
list.add(1);
list.add(0);
list.add(12);
list.add(9);
Collections.sort(list);
System.out.println(list);
}
}
输出:
[0, 1, 4, 9, 12, 55, 66]