当前位置: 首页 > article >正文

Arrays.sort和Collections.sort排序基本用法

00在算法中经常会对数组或者集合进行排序,可以直接使用包装的sort方法进行排序,同时在使用的时候也有很多注意事项

一、一维基本数据类型的数组进行排序:

int[] nums = {2, 3, 0, -1, 5};
Arrays.sort(nums);
for (int num : nums) {
    System.out.print(num + " ");   //-1 0 2 3 5
}

二、二维基本数据类型的数组进行排序:

//根据二维数组每行的第一个数对数组进行升序排序
Arrays.sort(nums, (a, b) -> a[0] - b[0]);

Arrays.sort(nums, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0] - o2[0];
    }
});



//先根据二维数组每行的第一个数对数组进行升序排序,在第一个数相同的情况下再根据第二个数进行升序排序
Arrays.sort(nums, (a,b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);

Arrays.sort(ints, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        if (o1[0] == o2[0]) {
            return o1[1] - o2[1];
        } else {
            return o1[0] - o2[0];
        }
                
    }
});

注意二(多)维数组的排序不能直接使用 Arrays.sort(nums),因为sort方法底层使用的 compare 方法是通过将对象转换为 Comparable,并使用其内部 compareTo 方法进行比较的,数据类型都是实现了 Comparable 接口,可实现对象转换,但二维数组对于单个的数据而言是 int[] 数组类型,无法实现到 Comparable的转换,使用会出现以下报错:java.lang.ClassCastException: [I cannot be cast to java.lang.Comparable]

多维数组可通过实现自定义 Comparable 的 compare 方法即可排序

三、自定义类的数组排序

Person[] people = new Person[2];
people[0] = new Person("1");
people[1] = new Person("2");
Arrays.sort(people, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        //return o1.getAge() - o2.getAge();
        return o1.getName().compareTo(o2.getName());
    }
});

自定义类进行排序时只需要重写 compare 方法并将排序的标准在方法中体现即可,注意基本数据类型的拆箱类型只能使用运算符,装箱类型可以使用运算符和 compareTo 方法,而String类型只能使用 compareTo 方法

四、基本数据类型的List集合进行排序

ArrayList<Integer> list = new ArrayList<>();
Collections.sort(list);
Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
});

Collections.sort 底层也是调用的 Array.sort 方法,通过将集合转换为数组再进行排序,同样也需要注意 Array.sort 可能会出现的类型转换和空指针问题

五、自定义类的集合排序

ArrayList<Person> list = new ArrayList<>();
Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
    }
});

六、基本数据类型的Map集合排序

HashMap<Integer, Integer> map = new HashMap<>();
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
        if (o1.getValue() != o2.getValue()) {
            return o2.getValue().compareTo(o1.getValue());  //降序
        }else {
            return o1.getKey().compareTo(o2.getKey());  //升序
        }
    }
});

七、List数组排序

List<Integer>[] arrayLists = new ArrayList[2];
Arrays.sort(arrayLists, new Comparator<List<Integer>>() {
    @Override
    public int compare(List<Integer> o1, List<Integer> o2) {
        return o1.get(0) - o2.get(0);
    }
});

注意:传递的类型为非基本类型时需要注意数组初始化,因为底层需要调用 compareTo 方法,如果非基本类型默认初始值为null,则会出现空指针异常

八、Map数组排序

HashMap<Integer, Integer>[] maps = new HashMap[2];
Arrays.sort(maps, new Comparator<HashMap<Integer, Integer>>() {
    @Override
    public int compare(HashMap<Integer, Integer> o1, HashMap<Integer, Integer> o2) {
        return o1.getOrDefault(0, -1) - o2.getOrDefault(0, -1);
    }
});

注意 Map 数组排序是需要根据 maps[0] 中的某个已存在的数据和 maps[1] 中某个已存在的数据进行比较排序

同理多维数组的排序都不能直接使用 Arrays.sort(lists)


总结:

  1. 数组使用 Arrays.sort() 方法进行排序,集合使用 Collections.sort() 方法进行排序
  2. 在使用 Comparator 类的 compare 方法自定义排序时,基本数据类型的拆箱类型只能使用运算符,装箱类型可以使用运算符和 compareTo 方法,而String类型只能使用 compareTo 方法
  3. 在对Map集合进行排序时,需要先将其转化为 List<Map.Entry<String, Integer>> 类型
  4. 多维数组不能使用 Arrays.sort(nums) 方式
  5. 传递的类型为非基本类型时需要注意数组初始化,因为底层需要调用 compareTo 方法,如果非基本类型默认初始值为null,则会出现空指针异常

http://www.kler.cn/a/443693.html

相关文章:

  • 微调大模型时,如何进行数据预处理? 将<input, output>转换为模型所需的<input_ids, labels, attention_mask>
  • QT的前景与互联网岗位发展
  • 为何页面搜索应避免左模糊和全模糊查询???
  • 餐饮业的数字化转型:JSP订餐管理系统的设计与开发
  • GitCode 光引计划投稿|MilvusPlus:开启向量数据库新篇章
  • 蓝桥杯物联网开发板硬件组成
  • Elasticsearch 实战应用:提升数据洞察与交互体验
  • 在 Solana 上实现 SOL 转账及构建支付分配器
  • 如何在 Spring Boot 中使用 Mapstruct
  • 计算机网络-L2TP VPN基础概念与原理
  • kafka理解记录
  • 清理悬空镜像以减少 Docker 空间占用
  • 二分查找题目:制作 m 束花所需的最少天数
  • Qt WORD/PDF(三)使用 QAxObject 对 Word 替换(QML)
  • Nginx常用配置详解(1)
  • upload-labs靶场1-19关
  • 【信息系统项目管理师-论文真题】2017下半年论文详解(包括解题思路和写作要点)
  • AUTOSAR OS 中Alarm 和 Event 本质和应用
  • 【WebRTC】视频发送链路中类的简单分析(上)
  • 【Golang】 Go 语言中的 Struct、JSON 和 Map 互转:详细指南
  • CTF知识集-PHP特性
  • NFTScan | 12.09~12.15 NFT 市场热点汇总
  • [NSSCTF 2022 Spring Recruit]factor
  • 对于给定PI参数的锁相环带宽简单计算方法
  • REST模式是什么,以及其他架构风格
  • 大模型中RAG模型的检索过程是如何实现的?(附最佳实践资料)