了解 Java 中 Comparator 的需求
在为 Java 对象实现自定义排序机制时,Comparator 的使用变得至关重要。 Comparable 接口虽然很有用,但只允许根据对象的自然顺序或通过在对象本身内定义比较函数来对对象进行排序。但是,在自然排序无法提供所需排序或不应更改对象状态的情况下,Comparator 接口就会发挥作用。
Comparator 使用说明
比较器提供了一种从外部定义排序标准的方法,支持不同的方法来比较和排序对象。它由一个方法compare组成,该方法接受两个对象作为参数,如果第一个参数应该在第二个参数之前排序,则返回一个负整数;如果第二个参数应该首先排序,则返回一个正整数;如果顺序不重要,则返回零.
代码中错误解决
初始代码中报错,java.lang.ClassCastException: New.People cannot be cast java.lang.Comparable 的出现是因为 People 类没有实现 Comparable 接口。相反,它实现了 Comparator 接口,该接口用于比较 People 类型的两个不同对象。解决此错误的方法包括从 People 类中删除 Comparator 接口的实现,并将其添加到将用于排序的单独类中。
演示代码:
为了说明比较器的正确用法,让我们考虑一个新的代码示例:
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class PersonComparatorDemo { public static void main(String[] args) { ArrayList<person> people = new ArrayList(); people.add(new Person("Joe", 24)); people.add(new Person("Pete", 18)); people.add(new Person("Chris", 21)); Collections.sort(people, new AgeComparator()); System.out.println(people); // Output: [Person{name='Pete', age=18}, Person{name='Chris', age=21}, Person{name='Joe', age=24}] } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{name='" + name + '\'' + ", age=" + age + '}'; } } class AgeComparator implements Comparator<person> { @Override public int compare(Person p1, Person p2) { return p1.getAge() - p2.getAge(); // Sorts people based on age (ascending) } }</person></person>
在此示例中,我们有具有姓名和年龄属性的 Person 类。定义了一个自定义的 AgeComparator,它实现了 Comparator 接口,并提供了一种根据年龄来比较人们的方法。
Java 8 Lambda 表达式用法
Java 8 引入了 lambda表达式,它提供了更简洁的方式来定义比较器:
import java.util.ArrayList; import java.util.Collections; public class PersonComparatorLambdaDemo { public static void main(String[] args) { ArrayList<person> people = new ArrayList(); people.add(new Person("Joe", 24)); people.add(new Person("Pete", 18)); people.add(new Person("Chris", 21)); Collections.sort(people, (p1, p2) -> p1.getAge() - p2.getAge()); System.out.println(people); // Output: [Person{name='Pete', age=18}, Person{name='Chris', age=21}, Person{name='Joe', age=24}] } }</person>
以上是何时以及为何应在 Java 中使用比较器?的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

Atom编辑器mac版下载
最流行的的开源编辑器

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)