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方法,但是稍稍有些麻烦,本文不再介绍。

原文地址:https://www.cnblogs.com/wangzheming35/p/12340950.html

时间: 2024-08-25 20:51:05

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

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

java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将ArrayList对象与实现Commparator接口的类的对象作为参数 示例: // 外部类的方式 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.uti

java 的sort方法

java的sort方法一般两种,分Array.sort() 和Collection.sort() Arrays.sort(T[], Comparator < ? super T > c) 方法用于对象数组按用户自定义规则排序. Collections.sort(List<T>, Comparator < ? super T > c)方法用于对象集合按用户自定义规则排序. comparable是通用的接口,用户可以实现它来完成自己特定的比较.我们使用Arrays对数组进行

JavaScript sort()方法比较器

当我们想把一个由数字组成的数组进行简单的排序时,可能会想到sort()方法: var arr = [2 , 3, -1, -107, -14, 1]; console.log(arr.sort()) 结果: [-1, -107, -14, 1, 2, 3] 这样显然是有问题的,因为调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,也就是按照字符编码的顺序进行排序. 所以我们需要一个比较器: console.log(arr.sort(function(a,b){ if(a<b){ re

Java中自定义对象使用Collections工具类中的Sort方法

Collections工具类中的sort方法有两种形式: (1) sort(List<T> list) (2) sort(List<T> list, Comparator<? super T> c) 第一种方法中List类型的对象必须实现Comparable接口,此外,List中的元素必须可比较. 我们先定义类 package com.dongye.sort; import java.util.ArrayList; import java.util.Collection

javascript 数组排序sort方法和自我实现排序方法的学习小结 by FungLeo

前言 针对一个数组进行排序,一个很常见的需求.尤其在后端.当然,前端也是有这个需求的. 当然,数组排序,是有现成的方法的.就是sort()方法. 我们先开看下这个. 标准答案,sort方法 var arr = [45,98,67,57,85,6,58,83,48,18]; console.log('原数组'); console.log(arr); console.log('sort方法从小到大排序'); console.log(arr.sort(function(a,b){return a-b}

Python中的sort()方法的使用

本文和大家分享的主要是python中的sort()方法相关知识,一起来看看吧,希望对大家学习python有所帮助. 一.基本形式 sorted(iterable[, cmp[, key[, reverse]]]) iterable.sort(cmp[, key[, reverse]]) 参数解释: (1)iterable指定要排序的list或者iterable,不用多说: (2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如: students为类对象的list

Python中的sort()方法使用基础

一.基本形式 sorted(iterable[, cmp[, key[, reverse]]]) iterable.sort(cmp[, key[, reverse]]) 参数解释: (1)iterable指定要排序的list或者iterable,不用多说: (2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如: students为类对象的list,没个成员有三个域,用sorted进行比较时可以自己定cmp函数,例如这里要通过比较第三个数据成员来排序,代码可以这

Java记录 -67- 深入剖析Collections的sort方法

Collections类可以将存储与List中的元素进行排序,可以按照针对元素的排序方法进行排序,也可以按照指定的排序类进行排序. Collections类提供了两个静态的sort方法: sort(List<T> list) sort(List<T> list, Comparator<? super T> c) 第一个方法是直接将List中的元素进行排序,排序方法需要List中存储的元素来提供,即存储的元素要是可排序的: 第二个方法除了提供要排序的List外,还需要提供

python中的sort方法

一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. x = [4, 6, 2, 1, 7, 9] x.sort() print x   # [1, 2, 4, 6, 7, 9] 如果需要一个排序好的副本,同时保持原有列表不变,怎么实现呢 x = [4, 6, 2, 1, 7, 9] y = x[ : ] y.sort() print  y   # [1, 2, 4, 6, 7, 9] print  x   # [4,