笔记--java sort() 方法排序

这篇具有很好参考价值的文章主要介绍了笔记--java sort() 方法排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景


最近在刷一道算法题 《字符串重新排序》时,发现自己有思路但是写代码的时候就无从下手了 而且看了答案之后还没看懂 关键就是基础不好 对于排序没有理解(虽然我学过常用的排序算法 但是都是理念 实践少)

目的


从实践和原理出发 重点是从实践出发 探讨如何使用 sort()方法 完成复杂的排序

能掌握到的知识

  1. 了解compaer(O1 ,O2) 中 返回1 -1 0 这三个什么意思 并且如何使用这三个值达到自己想要的排序
  2. 如何实现组合排序 即满足排序1情况下进行排序2

目录

  1. sort() 方法 简介
  2. sort() 方法使用
  3. 实战

sort()方法简介


sort()方法有很多种

  1. Arrays.sort()
    java sort,java,排序算法
  2. public void sort(java.util.Comparator<? super E> c )
    java sort,java,排序算法
    本次主要讨论的是第二种情况 并且是实现Comparator接口最简单的形式:

通过返回 1 0 -1 等三个数 比较列表中对象属性值的方法 实现的排序

如下所示

  userList.sort((o1,o2) ->{
            if (o1.getAge() > o2.getAge()) {
                //降序
                return -1;
            } else if (o1.getAge() < o2.getAge()) {
                return 1;
            } else {
                return 0;
            }

        });

sort()方法的使用


那1 0 -1 分别代表什么呢 怎么比较能够实现升序降序呢

PS:这里并不一定是1 和-1 只要是负整数和正整数就行了 只不过我们习惯上用1和-1表示
放两个结论

  1. 三个数代表的意思
    • 1:代表保持原样
    • 0:代表保持原样
    • -1:需要交换顺序
  2. 在排序前 o2 在o1前面

所以

  • 升序:
    • o1 > o2 时:前者比后者小 数越来越大 未排列前就是升序 不需要交换顺序 所以返回1或者0
    • o1 < o2 时: 前者比后者大 数越来越小 未排列前就是降序 需要交换顺序 返回 - 1

降序你可以自己总结 下面我们实战演示一下

1. 单个属性的排序要求

给出测试数据

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private int age;

    private int high;

    private String name;


  
}

例子

  public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(18, 165,"张三1"));
        userList.add(new User(16, 177, "张三11"));
        userList.add(new User(25, 189, "张三4"));
        userList.add(new User(25, 167,"张三3"));
        userList.add(new User(16, 155, "张三8"));


        userList.sort((o1,o2) ->{
            if (o1.getAge() > o2.getAge()) {
                //降序
                return -1;
            } else if (o1.getAge() < o2.getAge()) {
                // 降序
                return 0;
            } else {
                return 0;
            }

        });

//        userList.sort((o1,o2) ->{
//            if (o1.getAge() < o2.getAge()) {
//                //升序
//                return -1;
//            } else if (o1.getAge() > o2.getAge()) {
//                return 0;
//            } else {
//                return 0;
//            }
//
//        });
        System.out.println("userList = " + userList);
    }
  1. 第一个if 中 判断条件表示 年龄 越来越大 但是要返回-1 即交换顺序 所以是降序
  2. 第二个if中 判断条件表示 年龄 越来越小 返回1 即顺序不变 所以是升序
2. 组合排序

很多时候我们可能并不是只按一个属性进行排序 比如以下要求

  1. 先按照年龄升序
  2. 再按照身高降序
 public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(18, 165,"张三1"));
        userList.add(new User(16, 177, "张三11"));
        userList.add(new User(25, 189, "张三4"));
        userList.add(new User(25, 167,"张三3"));
        userList.add(new User(16, 155, "张三8"));

        userList.sort(((o1, o2) -> {
            //按照年龄升序
            if (o1.getAge() > o2.getAge()) {
                //后面的大于前面的数 数越来越大 即升序 所以不需要交换顺序
                return 1;
            } else if (o1.getAge() < o2.getAge()) {
                // 后面的小于前面的数 数越来越小 即降序 但是我们想要升序 所以需要交换顺序 返回-1
                return -1;
            } else {
                //相等时 按照身高降序
                if (o1.getHigh() > o2.getHigh()) {
                    // 后面的大于前面 即数越来越大 升序 但是我们想要降序 所以返回-1
                    return -1;

                } else if (o1.getHigh() < o2.getHigh()) {
                    return 1;
                } else {
                    return 0;
                }
            }
        }));


        System.out.println("userList = " + userList);
    }

实战


题目描述
有一串单词组成的英文字符串 需要下面要求进行排序

  1. 统计每个单词出现的次数,并按次数降序排列;
  2. 次数相同时,按单词长度升序排列;
    3)次数和单词长度均相同时,按字典序升序排列

举例

示例1

输入:
	This is an apple
输出:
	an is This apple

示例2

输入 
	Wisdom in the mind is better than money in the hand
输出
	in in the the is hand mind than money Wisdom better

代码

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String originString = scanner.nextLine();

        //1. 获取全部
      List<String> list = new ArrayList<>(Arrays.asList(originString.split(" ")));



        //2. 统计每个单词出现的次数
        Map<String, Long> countMap = statistic(list);

        // 3. 排序
        List<Map.Entry<String, Long>> collect = countMap.entrySet().stream()
                .sorted(((o1, o2) -> {
                    if (o2.getValue() < o1.getValue()) {
                        // 降序
                        return -1;
                    } else if (o1.getValue().equals(o2.getValue())) {
                        if (o2.getKey().length() > o1.getKey().length()) {
                            // 升序 o2是后面那个
                            return -1;
                        } else if (o1.getKey().length() == o2.getKey().length()) {
                            return o1.getKey().compareTo(o2.getKey());
                        }
                    }
                    return 1;
                })).collect(Collectors.toList());

        //4. 根据key 和value次数输出结果
        StringBuilder builder = new StringBuilder();
        for (Map.Entry<String, Long> entry : collect) {
            Long value = entry.getValue();
            String key = entry.getKey();
            for (int i = 0; i < value.intValue(); i++) {
                builder.append(key).append(" ");
            }

        }

        System.out.println(builder.substring(0, builder.length() - 1).toString());

    }
    
       private static Map<String, Long> statistic(List<String> list) {


        	Map<String, Long> collect = list.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        	return collect;

    }

我们主要关注第3点 排序那里的代码

参考:
CSDN博主「秃秃爱健身」的原创文章:https://blog.csdn.net/Saintmm/article/details/125218362文章来源地址https://www.toymoban.com/news/detail-729376.html

到了这里,关于笔记--java sort() 方法排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【排序算法】堆排序(Heap Sort)

    堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 学习堆排序之前,有必要了解堆!若读者不熟悉堆,建议先了解堆(建议可以通过二叉堆,左倾堆,

    2024年02月01日
    浏览(68)
  • 46,排序算法sort

    排序算法sort 常用排序算法 sort 学习目标: 掌握i常用排序算法 算法简介: sort //对容器内元素进行排序 random_shuffle //洗牌,指定范围内的元素随机调整次序 merge //容器元素合并,并存储到另一容器中 reverse //反转指定范围的元素 功能描述: 对容器内元素进行排序 函数原型:

    2024年02月16日
    浏览(39)
  • 【算法】桶排序(Bucket Sort)详解

    桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中排好序的数输出。 桶排序的思想就是把待排序

    2024年01月24日
    浏览(43)
  • C++(15): STL算法:排序(sort)

            std::sort 是 C++ 标准库 algorithm 中提供的一个函数,用于对容器(如数组、向量等)中的元素进行排序。它基于比较操作对元素进行排序,通常使用高效的排序算法,如快速排序、归并排序或堆排序等。         在实际应用中,std::sort 通常会根据输入数据的大

    2024年04月12日
    浏览(31)
  • 算法 - 快速排序(Quick_sort)

    目录 什么是快速排序? 快速排序的使用场景: 演示快速排序的过程: 第一趟排序: 第二趟排序: 通过代码来实现:  对快速排序的总结: 在写快速排序的代码之前,我们先对快速排序的排序原理以及定义进行梳理: 快速排序(Quick_sort)是对冒泡排序的一种改进,它也是

    2024年02月10日
    浏览(41)
  • 算法 - 归并排序(Merge_sort)

    目录 什么是归并排序(Merging_sort)? 归并排序的适用场景: 演示归并排序的过程(默认arr和brr两个数组都是有序的): 代码实现: 如果我们事先并没有分配好两个已经排序好的数组,而是直接的一个无序序列呢? 代码实现: 在写归并排序的代码之前,我们先对归并排序的定义

    2024年02月13日
    浏览(49)
  • 图解快排——快速排序算法(quick sort)

    算法思想 快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。 快速排序的基本思想: 通过一趟排序将待排序的序列分割为左右两个子序列,左边的子序列中所有数据都比右边子序列中的数据小,然后对

    2024年01月16日
    浏览(36)
  • 十大排序算法(Top 10 Sorting Algorithms)

    十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因

    2024年02月08日
    浏览(45)
  • python算法 之 快速排序(Quick Sort)

    时间复杂度 名称 示例算法 O(1) 常数时间复杂度 哈希表查找 O(logn) 对数时间复杂度 二分查找 O(n) 线性时间复杂度 遍历数组 O(nlogn) 线性对数时间复杂度 快速排序 O(n^2) 平方时间复杂度 冒泡排序、插入排序 O(n^3) 立方时间复杂度 矩阵乘法 O(2^n) 指数时间复杂度 穷举搜索 O(n!) 阶

    2024年02月04日
    浏览(39)
  • Sorting Algorithms in Python (排序算法)

    本篇文章主要介绍几种经典排序算法:冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、桶排序和基数排序。并给出用python实现的算法代码。 目录 一、冒泡排序 二、快速排序 三、选择排序 四、堆排序 五、插入排序 六、希尔排序 七、归并排序 八

    2024年04月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包