sort方法和自定義比較器的寫法


摘要

在做一些算法題時常常會需要對數組、自定義對象、集合進行排序. 在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方法,但是稍稍有些麻煩,本文不再介紹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM