java中sort方法的自定义比较器写法

news/2024/5/19 22:17:18 标签: java, 蓝桥杯, 快速排序, sort

文章目录

  • 摘要
  • 对数组排序
  • 对集合进行排序
  • 对自定义对象数组排序

常用JAVA API和基础算法合集:
https://blog.csdn.net/GD_ONE/article/details/104061907

摘要

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

对数组排序

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

java">Arrays.sort(arr, new Comparator<Integer>() { // arr是数组名,<>中是待排序集合所包含的数据类型
	public int compare(int a, int b){  // 待排序集合中的元素是什么数据类型,这里的两个函数参数就定义为什么数据类型
		 return a - b;   升序
		// return b - a;   降序
		// a - b > 0 交换ab位置,反之不变, 即返回值为正数时,交换数组中正在比较的
		//两个元素的位置,返回值为负数时,不交换。 
		}
	})

例题: 快速排序

给定你一个长度为n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式
输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。

输出格式
输出共一行,包含 n 个整数,表示排好序的数列。

数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

可以将字符串数组转化为整型数组之后在排序,为了演示自定义比较器的写法这里直接对字符串数组进行排序

java">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, 之后添加数据就会自动排序。

java">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

对自定义对象数组排序

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

java">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方法。
代码:

java">
//对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;
    	}
    }

http://www.niftyadmin.cn/n/1465609.html

相关文章

[leetCode]541. 反转字符串 II

博客园&#xff1a;https://www.cnblogs.com/PythonFCG/p/13890451.html 题目 链接&#xff1a;https://leetcode-cn.com/problems/reverse-string-ii 给定一个字符串 s 和一个整数 k&#xff0c;你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。 如果剩余字…

[leetCode]151. 翻转字符串里的单词

博客园&#xff1a;https://www.cnblogs.com/PythonFCG/p/13891809.html 题目 给定一个字符串&#xff0c;逐个翻转字符串中的每个单词。 说明&#xff1a; 无空格字符构成一个 单词 。 输入字符串可以在前面或者后面包含多余的空格&#xff0c;但是反转后的字符不能包括。 …

和ts一般怎么玩_攻略|梦幻西游手游:金币小号怎么玩?高手一般都这么弄

恭喜发财&#xff0c;我是大白&#xff01;~梦幻西游手游里&#xff0c;很多玩家已经开始意识到小号的重要性&#xff01;无论是游戏中朋友的弃坑号还是自己练的号&#xff0c;每个人手上或多或少都有一点吧&#xff1f;但是小号你真的会用吗&#xff1f;今天大白就来分享一下&…

[leetCode]129. 求根到叶子节点数字之和

博客园: https://www.cnblogs.com/PythonFCG/p/13895105.html 题目 链接&#xff1a;https://leetcode-cn.com/problems/sum-root-to-leaf-numbers 给定一个二叉树&#xff0c;它的每个结点都存放一个 0-9 的数字&#xff0c;每条从根到叶子节点的路径都代表一个数字。 例如&a…

最短路问题的五种算法

单元最短路和多源汇最短路的适用算法摘要单源最短路&#xff1a; 一个点到其他点的最短路。多源汇最短路&#xff1a; 任意两点间的最短路。图的存储方式朴素Dijkstra堆优化DijkstraBellman-Ford求总路径条数不多于K条的最短路径SPFA堆优化Dijkstra和SPFA的区别和优缺点用SPFA判…

恩智浦 mcu 初始化程序_用MCU设计HMI图形显示方案:恩智浦专家讲解,一学就会!...

在今天的人机交互设计中&#xff0c;图形化显示凭借其既直观又美观的特性&#xff0c;已经成为了越来越多应用领域的标配。以往图形显示方案的开发&#xff0c;并不是一件轻松的事。在这里&#xff0c;恩智浦的专家将向你展示如何基于恩智浦MCU和第三方的图形库软件资源&#x…

[leetCode]463. 岛屿的周长

题目 链接&#xff1a;https://leetcode-cn.com/problems/island-perimeter 给定一个包含 0 和 1 的二维网格地图&#xff0c;其中 1 表示陆地 0 表示水域。 网格中的格子水平和垂直方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中…

哈希桶的增删查改简单实现

个人简单笔记。 目录 闭散列 开散列 插入 删除 查找 改变 什么是哈希桶呢&#xff1f;这是一个解决哈希数据结构的一种解决方法&#xff0c;在STL中的unorder_map与unorder_set的底层结构就是使用它来实现的。 闭散列 首先我们知道&#xff0c;哈希映射表是依据数组下…