摘要
在做一些算法題時常常會需要對數組、自定義對象、集合進行排序. 在java中對數組排序提供了
Arrays.sort()
方法,對集合排序提供Collections.sort()
方法。對自定義對象排序時要自己重寫比較器,對象數組則調用Arrays.sort(),對象集合則調用Collections.sort()。兩個方法默認都是升序,也可以重寫比較器,實現降序。
對數組排序
sort函數模板, 以int型數組為例:
Arrays.sort(int[] a, Comparator<Integer>() {
public int compare(int a, int b){
return a - b; 升序
// return b - a; 降序
/* a-b>0 交換ab位置,反之不變, 即返回值為正數時,交換數組中正在比較
的兩個元素的位置,返回值為負數時,不交換。 記住第一個參數去比較第二個
參數就是升序,第二個參數比較第一個參數就是降序就OK了。
*/
}
})
例題: 快速排序
給定你一個長度為n的整數數列。
請你使用快速排序對這個數列按照從小到大進行排序。
並將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n。
第二行包含 n 個整數(所有整數均在1~109范圍內),表示整個數列。
輸出格式
輸出共一行,包含 n 個整數,表示排好序的數列。
數據范圍
1≤n≤100000
輸入樣例:
5
3 1 2 4 5
輸出樣例:
1 2 3 4 5
可以將字符串數組轉化為整型數組之后在排序,為了演示自定義比較器的寫法這里直接對字符串數組進行排序:
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
public class ArraySortDemo {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
int n;
n = Integer.parseInt(in.readLine());
String[] s = in.readLine().split(" "); //讀入數據
Arrays.sort(s, new Comparator<String>() {
@Override
public int compare(String a, String b) {
if (a.length()==b.length()) { // 如果長度相等則直接比較字典序
return a.compareTo(b);
}
else {
return a.length()-b.length();
}
}
});
for (String str: s
) {
out.write(str+" ");
}
out.flush();
}
}
對集合進行排序
創建TreeSet實例,對其從大到小排序。
因為TreeSet是自動排序和去重的, 默認為升序,我們可以重寫比較器構造一個降序的TreeSet, 之后添加數據就會自動排序。
import java.io.*;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetSortDemo {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
TreeSet<Integer> s = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return b-a; //降序
}
});
s.add(10);
s.add(5);
s.add(4);
s.add(6);
s.add(7);
s.add(8);
s.add(1);
s.add(2);
s.add(3);
s.add(9);
for (Integer i: s
) {
out.write(i+" ");
}
out.flush();
}
}
輸出:
10 9 8 7 6 5 4 3 2 1
對自定義對象數組排序
創建學生類, 按照年齡從小到大排序
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
public class StudentsAgeSortDemo {
//創建學生類, 按照年齡從小到大排序
static class student{
int age;
String name;
student(int a,String b) {
this.age=a;
this.name=b;
}
}
public static void main(String[] args)throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
student[] s = new student[4];
s[0] = new student(3,"張三");
s[1] = new student(4,"李四");
s[2] = new student(5,"王五");
s[3] = new student(6,"趙六");
Arrays.sort(s, new Comparator<student>() {
@Override
public int compare(student a, student b) {
return a.age-b.age;// 按照年齡小-大升序排列
}
});
for (student S:s
) {
out.write(S.age+" "+S.name+"\n");
}
out.flush();
}
}
輸出:
3 張三
4 李四
5 王五
6 趙六
大致就是這樣了,還可以對要排序的類實現Comparable接口,重寫compareTo方法,但是稍稍有些麻煩,本文不再介紹。