摘要

在做一些算法题时常常会需要对数组、自定义对象、集合进行排序. 在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方法,但是稍稍有些麻烦,本文不再介绍。

sort方法和自定义比较器的写法的更多相关文章

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

    java中sort方法的自定义比较器写法 摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collecti ...

  2. Java中的equals方法和自定义比较器

    Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...

  3. 定制对ArrayList的sort方法的自定义排序

    java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将Arr ...

  4. 通过自定义比较器排序(C#版)

    一.方法概述 自定义比较器需要实现接口IComparer<T> 二.示例过程 1.新建一个Product产品类 /// <summary> /// 产品类 /// </s ...

  5. JavaScript sort()方法比较器

    当我们想把一个由数字组成的数组进行简单的排序时,可能会想到sort()方法: var arr = [2 , 3, -1, -107, -14, 1]; console.log(arr.sort()) ...

  6. java中的排序(自定义数据排序)--使用Collections的sort方法

    排序:将一组数据按相应的规则 排列 顺序 1.规则:       基本数据类型:日常的大小排序. 引用类型: 内置引用类型(String,Integer..),内部已经指定规则,直接使用即可.---- ...

  7. ArrayList 排序Sort()方法扩展

    1.sort() sort可以直接对默认继承 IComparable接口的类进行排序,如:int.string.... ArrayList arrayList = new ArrayList(); , ...

  8. python中sorted方法和列表的sort方法使用详解

    一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. 排序,数字.字符串按照ASCII,中文按照unicode从小到大排序 ...

  9. TreeMap和TreeSet在排序时如何比较元素,Collections工具类中的sort()方法如何比较元素

    TreeSet和TreeMap排序时比较元素要求元素对象必须实现Comparable接口 Collections的sort方法比较元素有两种方法: 元素对象实现Comparable接口 实体类Dog ...

随机推荐

  1. Storm近年的发展

    storm作为第一款大数据领域的流式计算引擎,在2013年推出之后风头一时无二.后续虽然有spark streaming也作为流式计算的引擎,但storm依然在流式计算的江湖占有稳定的地位.直到201 ...

  2. 网络游戏逆向分析-6-使用背包物品call

    网络游戏逆向分析-6-使用背包物品call 首先,大家在处理网络游戏的时候,一定得利用好发包函数,因为他就是整个网络游戏的关键. 处理办法: 这里还是直接给发包打断点来处理. 就像我们之前处理喊话函数 ...

  3. mysql忘记root密码连接本地库

    http://www.cnblogs.com/zf2011/archive/2012/03/13/2393387.html 今天想做个小项目,决定用mysql数据库,但是好久没用mysql了,也忘掉了 ...

  4. 记录不存在则插入,存在则更新 → MySQL 的实现方式有哪些?

    开心一刻 今天我爸.我.我女儿一起吃饭,我们每人一个鸡腿 女儿问道:爸爸,你吃鸡腿吗 我以为她要把她的鸡腿给我吃,倍感欣慰地说道:我不吃,宝贝 女儿一把抓起我的鸡腿放进了她爷爷的碗里,说道:不吃给爷爷 ...

  5. tomcat URI get 参数中文传到后台 乱码 URIEncoding

    * 修改tomcat server.xml 找到这一行 <Connector connectionTimeout="20000" port="80" pr ...

  6. greedy algorithm, insertion sort, quick sort

    always makes the choice that seems to be the best at that moment. Example #1: @function:  scheduling ...

  7. 『Python』面向对象(二)

    继承 继承的语法 class Animal(object): def __init__(self,name): self.__name = name class Dog(Animal): kind = ...

  8. re.findall用法

    其中,re.findall() 函数可以遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表. 在python源代码中,展示如下: 搜索string,返回一个顺序访问每一个匹配结果(Match对象 ...

  9. 10分钟教你使用Picgo+GitHub+ jsDelivr搭建CDN加速免费图床

    前言 经常写Markdown或者博客的同学,肯定都要用到图床.图床是什么呢?其实相当于一个存储图片的网站,类似百度云这样,不过上传图片到图床后可以直接通过外链进行访问. 比如把本地一张a.jpg上传到 ...

  10. 【C++ Primer Plus】编程练习答案——第4章

    1 void ch4_1() { 2 using namespace std; 3 string fname, lname; 4 char grade; 5 unsigned int age; 6 c ...