【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )

简介: 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )

文章目录

一、报错信息

二、解决方案





一、报错信息


使用 Comparator 接口 , 对 ArrayList 集合中的元素排序无效 ;


打印之后没有进行排序 ;


错误代码就不贴出来了 , 随便搜索的代码 , 一用就出错 ;



Java 1.7 1.71.7 及以上的版本中 , Comparator 接口 compare 方法的返回值必须是一对相反的数值 , 如 − 1 -1−1 和 + 1 +1+1 ; 不能返回 1 11 和 0 00 ;






二、解决方案


Comparator 接口 正确的使用方法 :


   

list.sort(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 升序排序
                if (o1.age > o2.age) {
                    return 1;
                } else {
                    return -1;
                }
            }
        });



完整代码示例 :


import java.util.ArrayList;
import java.util.Comparator;
public class Sort {
    static class Student{
        String name;
        int age;
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    public static void main(String[] args) {
        // 构造对象
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("Tom", 18));
        list.add(new Student("Jerry", 14));
        list.add(new Student("Cat", 20));
        list.add(new Student("Mouse", 19));
        list.sort(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 升序排序
                if (o1.age > o2.age) {
                    return 1;
                } else {
                    return -1;
                }
            }
        });
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).toString());
        }
    }
}


执行结果 :


image.png

目录
相关文章
|
4月前
|
人工智能 安全 JavaScript
Java ArrayList:动态数组
本文探讨Java中的数组,对比C/C++、JS/PHP/Python等语言的数组特性。文章分析了Java数组的定义、创建方式及其规范,指出其优缺点。Java数组作为引用类型,在堆上分配内存,支持动态大小,避免了C/C++中裸数组的常见问题(如越界访问)。然而,Java数组也存在性能瓶颈和设计缺陷,例如运行时的安全检查影响速度,无法创建超大数组或泛型数组,且多线程场景下缺乏同步机制。作者建议在实际开发中用集合替代数组以规避这些问题。
108 1
|
2月前
|
Java 索引
Java ArrayList中的常见删除操作及方法详解。
通过这些方法,Java `ArrayList` 提供了灵活而强大的操作来处理元素的移除,这些方法能够满足不同场景下的需求。
308 30
|
2月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
150 14
|
8月前
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
99 20
|
10月前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
319 4
Java ArrayList扩容的原理
|
10月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
11月前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
498 3
|
11月前
|
Java
Java“缺少返回值”解决
在Java中,如果方法声明了返回类型,则必须确保所有可能的执行路径都返回一个值。解决“缺少返回值”问题的方法包括:使用默认返回值、抛出异常或确保所有条件分支都有返回值。
201 1
|
Java
【Java】Comparable和Comparator接口
【Java】Comparable和Comparator接口
548 0
【Java】Comparable和Comparator接口
|
Java 编译器
深度解析Java中的Comparable接口和Comparator接口
深度解析Java中的Comparable接口和Comparator接口
193 0

热门文章

最新文章