排序主要分爲三種情況
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]