Java 集合、數組排序

在平時開發的過程當中,常常會遇到須要對數組、集合中元素按規則進行排序,本文記錄在開發過程當中可能遇到的狀況以及相關的完整代碼示例。java

知識點

  • Comparable<T>接口
    實現了該接口的對象,必須重寫compareTo方法,對象實現了該接口,則該對象具備排序功能,好比String、Integer等。
  • Comparator<T>接口
    要實現自定義排序器的時候,須要實現該接口。當某個類不具有排序功能或者已有的排序功能不足以支撐你需求的時候,就是自定義排序器登場的時候了。好比String內置的排序實現按字符順序排序,那我想按字符串長度排序咋辦呢?這時就能夠自定義實現Comparator的對象了。
  • 數組(好比String[])排序使用Arrays.sort
  • 集合(好比List<T>)排序使用Collections.sort

實例

1. 默認String排序示例

1.1 數組排序用法git

String[] strArr = new String[]{"zhangsan","lisi","wangwu"};
//數組默認按字符升序排序
Arrays.sort(strArr);
System.out.println("默認按字母升序排序:");
for (String str:strArr) {
    System.out.println(str);
}

1.2 集合排序用法github

List<String> strList = new ArrayList<>();
strList.add("zhangsan");
strList.add("lisi");
strList.add("wangwu");
//集合默認按字符升序排序
Collections.sort(strList);
System.out.println("默認按字母升序排序:");
for (String str:strList) {
    System.out.println(str);
}
  • 以上兩個例子都是輸出:
    在這裏插入圖片描述

2.自定義排序器,String數組按字符串長度倒序

  • 建立自定義排序器StringComparator
package com.simon.interfacedemo.sortdemo.stringdemo;

import java.util.Comparator;
/**
 * @Description: 經過實現Comparator接口,實現自定義排序
 */
public class StringComparator implements Comparator<String>{
    /**
     * 按字符串長度降序排序
     */
    @Override
    public int compare(String o1, String o2) {
        return o1.length() > o2.length() ? -1 : 1;
    }
}

2.1 數組使用StringComparator排序器數組

String[] strArr = new String[]{"zhangsan","lisi","wangwu"};
//自定義排序,按字符串長度升序
Arrays.sort(strArr,new StringComparator());
System.out.println("自定義排序,按字符串長度降序排序:");
for (String str:strArr) {
    System.out.println(str);
}

2.2 集合使用StringComparator排序器ide

List<String> strList = new ArrayList<>();
strList.add("zhangsan");
strList.add("lisi");
strList.add("wangwu");
//自定義排序,按字符串長度降序
Collections.sort(strList,new StringComparator());
System.out.println("自定義排序,按字符串長度降序排序:");
for (String str:strList) {
    System.out.println(str);
}
  • 以上兩個例子都是輸出:
    在這裏插入圖片描述

3.自定義類實現Comparable接口,使類具備排序功能

  • 自定義Student類,實現Comparable接口,重寫compareTo方法,按age升序排序
public class Student implements Comparable<Student>{

    private String name;
    private Integer age;

    public Student(String name,Integer age){
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    /**
     * 實現compareTo接口方法,按age升序。
     * @param o
     * @return 返回1:大於,0:等於,-1:小於
     */
    @Override
    public int compareTo(Student o) {
        return Integer.compare(age,o.age);
    }

   /**
     * 重寫toString方法,方便System.out.println打印出詳細的信息。
     */
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.1 Student數組按age升序排序this

Student[] students = new Student[3];
students[0] = new Student("zhangsan",30);
students[1] = new Student("lisi",28);
students[2] = new Student("wangwu",33);

System.out.println("經過student實現的默認排序,根據age升序排序:");
Arrays.sort(students);
for (Student student : students) {
    System.out.println(student);
}

3.2 Student集合按age升序排序code

List<Student> studentList = new ArrayList<>();
studentList.add(new Student("zhangsan",30));
studentList.add(new Student("lisi",28));
studentList.add(new Student("wangwu",33));
System.out.println("經過student實現的默認排序,根據age升序排序:");
Collections.sort(studentList);
for (Student student : studentList) {
    System.out.println(student);
}
  • 以上兩個例子都是輸出:
    在這裏插入圖片描述

4.自定義排序器,按Student的name長度升序排序

  • 建立自定義排序器StudentComparator
package com.simon.interfacedemo.sortdemo.studentdemo;

import java.util.Comparator;
/**
 * @Description: 經過實現Comparator接口,實現自定義排序
 */
public class StudentComparator implements Comparator<Student>{
    /**
     * 按名字長度升序排序
     */
    @Override
    public int compare(Student o1, Student o2) {

        return o1.getName().length() > o2.getName().length() ? 1 : -1;
    }
}

4.1 數組使用StudentComparator排序器對象

Student[] students = new Student[3];
students[0] = new Student("zhangsan",30);
students[1] = new Student("lisi",28);
students[2] = new Student("wangwu",33);

System.out.println("經過自定義排序器實現的排序,根據名字長度排序:");
Arrays.sort(students,new StudentComparator());
for (Student student : students) {
    System.out.println(student);
}

4.2 集合使用StudentComparator排序器blog

List<Student> studentList = new ArrayList<>();
studentList.add(new Student("zhangsan",30));
studentList.add(new Student("lisi",28));
studentList.add(new Student("wangwu",33));

System.out.println("經過自定義排序器實現的排序,根據名字長度排序:");
Collections.sort(studentList,new StudentComparator());
for (Student student : students) {
    System.out.println(student);
}
  • 以上兩個例子都是輸出:
    在這裏插入圖片描述

後續

  • 以上列出了實際開發中可能用到的數組、集合的排序方式。使用lambda還能夠更簡化,後續再總結出來。
  • 以上示例均可以經過個人GitHub獲取完整的代碼,點擊獲取
相關文章
相關標籤/搜索