java中sort方法的自定义比较器写法(转载)

在做一些算法题时常常会需要对数组、自定义对象、集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collections.sort()方法。对自定义对象排序时要自己重写比较器,对象数组则调用Arrays.sort(),对象集合则调用Collections.sort()。两个方法默认都是升序,也可以重写比较器,实现降序。

 

对数组排序

sort函数模板, 以int型数组arr为例:

Arrays.sort(arr, new Comparator<Integer>() { // arr是数组名,<>中是待排序集合所包含的数据类型
	public int compare(int a, int b){  // 待排序集合中的元素是什么数据类型,这里的两个函数参数就定义为什么数据类型
		 return a - b;   升序
		// return b - a;   降序
		// a - b > 0 交换ab位置,反之不变, 即返回值为正数时,交换数组中正在比较的
		//两个元素的位置,返回值为负数时,不交换。
		}
	})
// 注意,要想改变默认的排列顺序,不能使用基本类型(int,double, char)
		// 而要使用它们对应的类
		Integer[] a2 = { 9, 8, 7, 2, 3, 4, 1, 0, 6, 5 };
		Comparator cmp = new MyComparator();
		Arrays.sort(a2,cmp);
		System.out.println();
		for (Integer integer : a2) {
			System.out.print(integer+" ");
		}
输出:
    9 8 7 6 5 4 3 2 1 0
//Comparator是一个接口,所以这里我们自己定义的类MyComparator要implents该接口
// 而不是extends Comparator
class MyComparator implements Comparator<Integer> {
	@Override
	public int compare(Integer o1, Integer o2) {
		// 如果o1小于o2,我们就返回正值,如果o1大于o2我们就返回负值,
		// 这样颠倒一下,就可以实现反向排序了
		if (o1 < o2) {
			return 1;
		} else if (o1 > o2) {
			return -1;
		} else {
			return 0;
		}
	}
}
例题: 快速排序

给定你一个长度为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.*;
public class Main{
	// 输入输出模板
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
	static int n;
	public static void main(String[] args) throws IOException {
		n = Integer.parseInt(in.readLine());
		String s[] = in.readLine().split(" ");// 读入数据
		Arrays.sort(s, new Comparator<String>() { // 排序
			public int compare(String a, String b) {
	        	if(a.length() == b.length()){ // 如果长度相等则直接比较字典序
	        		return a.compareTo(b);
	        	}
	        	else{ // 长度长的一定大
	        		return a.length() - b.length();
	        	}
			}
		});
		for(String p : s){
			out.write(p+" ");
		}
		out.flush();
	}
}

对集合进行排序

创建TreeSet实例,对其从大到小排序。

因为TreeSet是自动排序和去重的, 默认为升序,我们可以重写比较器构造一个降序的TreeSet, 之后添加数据就会自动排序。

import java.io.*;
import java.util.*;
public class Main{
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
	public static void main(String[] args) throws IOException {
		TreeSet<Integer> s = new TreeSet<>(new Comparator<Integer>(){
			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 p : s){
			out.write(p+" ");
		}
		out.flush();
	}
}
输出:
10 9 8 7 6 5 4 3 2 1

对自定义对象数组排序

创建学生类, 按照年龄从小到大排序

import java.io.*;
import java.util.*;
class student{
	int age;
	String name;
	student(int a, String b){
		this.age = a;
		this.name = b;
	}
}
public class Main{
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
	public static void main(String[] args) throws IOException {
		student s[] = new student[4]; //创建学生对象数组
		s[0] = new student(10, "1");
		s[1] = new student(9, "2");
		s[2] = new student(8, "3");
		s[3] = new student(7, "4");
		Arrays.sort(s, new Comparator<student>() {
			public int compare(student a, student b) {  //
	        	return a.age - b.age; // 按照年龄大小升序排列
			}
		});
		for(student p : s){
			out.write(p.age+" "+p.name + "\n");
		}
		out.flush();
	}
}
输出:
7 4
8 3
9 2
10 1

大致就是这样了,还可以对要排序的类实现Comparable接口,重写compareTo方法。

代码:

//对pair类实现Comparable接口后,直接调用sort函数排序就行了。
static class pair implements Comparable<pair>{
        int a, b, w;
        pair(int u, int v, int x){
            a = u;
            b = v;
            w = x;
        }
        public int compareTo(pair p) {
    		return this.w - p.w;
    	}
    }

利用 Arrays.sort 字符串 进行排序 完全按字符 排序 忽略字符大小写

有的时候需要对数组里的element进行排序。当然可以自己编写合适的排序方法,但既然java包里有自带的Arrays.sort排序方法,在数组元素比较少的时候为何不用?

Sorting an Array

1. 数字排序
   int[] intArray = new int[] {4, 1, 3, -23};
    Arrays.sort(intArray);
    输出: [-23, 1, 3, 4]
2.  字符串排序,先大写后小写
    String[] strArray = new String[] {"z", "a", "C"};
    Arrays.sort(strArray);
    输出: [C, a, z]
3.    严格按字母表顺序排序,也就是忽略大小写排序 Case-insensitive sort
    Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
    输出: [a, C, z]
4. 反向排序, Reverse-order sort
    Arrays.sort(strArray, Collections.reverseOrder());
   输出:[z, a, C]
5. 忽略大小写反向排序    Case-insensitive reverse-order sort
    Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
    Collections.reverse(Arrays.asList(strArray));
    输出: [z, C, a]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值