Java 自定义对象排序实战解析:Comparable接口与Arrays.sort的应用
一、原题完整代码呈现
以下是计算机二级Java考试中关于自定义对象数组排序的典型题型,主要考察数组排序方法、接口实现、类成员访问及数据类型定义,包含4处需要填写的空白(标记为//*********Found**********
):
import java.util.*;
public class Java_2
{
public static void main(String[] args)
{
Student[] java = new Student[3];
java[0] = new Student("李明", 80);
java[1] = new Student("赵冬", 75);
java[2] = new Student("王晓", 98);
//*********Found**********
Arrays.sort(__________________);
System.out.println("Java 成绩降序排序的结果是:");
for (int i = 0; i < java.length; i++)
{
Student e = java[i];
//*********Found**********
System.out.println("name=" + e.______________
+ ",fenshu=" + e.getFenshu());
}
}
}
//*********Found**********
class Student ___________________ Comparable
{
public Student(String n, double f)
{
name = n;
fenshu = f;
}
public String getName()
{
return name;
}
public double getFenshu()
{
return fenshu;
}
public int compareTo(Object otherObject)
{
Student other = (Student)otherObject;
if (fenshu < other.fenshu) return 1;
if (fenshu > other.fenshu) return -1;
return 0;
}
private String name;
//*********Found**********
private _________________ fenshu;
}
二、空白处逐一解析与解答
1. 第一处空白:指定要排序的数组
答案:java
//*********Found**********
Arrays.sort(java);
解析: Arrays.sort()
方法用于对数组进行排序,参数为要排序的数组对象。本题中需要排序的是Student
类型的数组java
(包含3个学生对象),因此传入数组名java
,使数组按自定义规则排序。
2. 第二处空白:获取学生姓名(通过getter方法)
答案:getName()
//*********Found**********
System.out.println("name=" + e.getName()
+ ",fenshu=" + e.getFenshu());
解析: Student
类中姓名name
是私有成员(private String name
),无法直接访问,需通过公共的getter方法getName()
获取。此处需要输出学生姓名,因此调用e.getName()
。
3. 第三处空白:实现Comparable接口
答案:implements
//*********Found**********
class Student implements Comparable
解析:
要使自定义对象数组可通过Arrays.sort()
排序,对象所属的类必须实现Comparable
接口(该接口包含compareTo
方法,定义排序规则)。Java中实现接口的关键字是implements
,因此填写implements
。
4. 第四处空白:定义成绩的变量类型
答案:double
//*********Found**********
private double fenshu;
解析:
构造方法Student(String n, double f)
中,参数f
的类型为double
,且赋值给fenshu
(fenshu = f
),因此fenshu
的类型必须为double
,确保类型匹配。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序实现对学生对象数组按成绩降序排序并输出,核心功能包括:
- 创建3个
Student
对象(包含姓名和成绩属性),存储在数组中 - 使用
Arrays.sort()
对数组进行排序(基于自定义的成绩降序规则) - 遍历排序后的数组,输出每个学生的姓名和成绩
运行说明
初始化数组:
创建Student[] java
数组,包含3个学生:- 李明(80分)、赵冬(75分)、王晓(98分)
排序过程:
Arrays.sort(java)
调用Student
类的compareTo
方法实现排序:- 比较规则:若当前学生成绩 < 另一个学生成绩,返回1(当前对象"更大",排在前面)
- 若当前学生成绩 > 另一个学生成绩,返回-1(当前对象"更小",排在后面)
- 最终实现降序排序(从高到低)
输出结果:
排序后按顺序输出:Java 成绩降序排序的结果是: name=王晓,fenshu=98.0 name=李明,fenshu=80.0 name=赵冬,fenshu=75.0
五、核心知识点总结
自定义对象排序的核心:Comparable接口
- 接口作用:
Comparable
接口是Java集合框架中排序的基础,通过compareTo
方法定义对象的比较规则 方法实现:
public int compareTo(Object otherObject)
需返回三类值:- 正数:当前对象 > 比较对象(在排序中应排在前面)
- 负数:当前对象 < 比较对象(在排序中应排在后面)
- 0:两对象相等(位置不变)
- 本题逻辑:
return 1
(当前成绩低则排在后面)、return -1
(当前成绩高则排在前面),实现降序
- 接口作用:
Arrays.sort()的工作原理
- 适用场景:
Arrays.sort()
可对对象数组排序,但要求数组元素实现Comparable
接口 - 排序机制:内部通过比较器(
Comparable
)的compareTo
方法确定元素顺序,对基本类型数组使用自然排序,对对象数组使用自定义排序
- 适用场景:
类的封装与访问控制
- 私有成员:
name
和fenshu
声明为private
,确保数据安全性(外部无法直接修改) - Getter方法:
getName()
和getFenshu()
提供公共访问接口,遵循"封装"原则(隐藏实现细节,暴露必要接口)
- 私有成员:
数据类型匹配
- 成员变量类型:
fenshu
的类型为double
,与构造方法参数double f
一致,避免类型转换错误 - 接口实现:
class Student implements Comparable
确保类具备可比较性,使Arrays.sort()
能正常工作
- 成员变量类型:
六、常见错误与应试技巧
常见错误分析
- 第一处空白数组参数错误:写成
Student
(类名而非数组名)或java[]
(语法错误,数组名后不加[]),导致排序方法无法找到目标数组 - 第二处空白姓名访问错误:直接访问
e.name
(私有成员,编译错误)或写成getname()
(方法名大小写错误),无法获取姓名 - 第三处空白接口实现错误:写成
extends Comparable
(接口不能继承,只能实现)或拼写错误(如implemets
),导致类不具备可比较性 - 第四处空白类型定义错误:写成
int
(与构造方法的double f
不匹配)或Float
(包装类与基本类型不兼容),导致赋值错误
- 第一处空白数组参数错误:写成
应试技巧
- 排序口诀:"自定义对象要排序,Comparable接口来实现;compareTo方法定规则,正负零值分前后"
- 封装原则:"私有成员藏起来,getter方法露出来,外部访问才合规"
- Arrays.sort使用:"数组排序用sort,参数就是数组名;对象数组要排序,先让类把Comparable实现"
- 类型匹配:"成员变量看构造,参数类型要相同,避免错误保运行"
通过本题,我们掌握了自定义对象排序的核心机制(Comparable
接口)、Arrays.sort()
的应用、类的封装原则及数据类型匹配的重要性。排序是数据处理的基础操作,理解对象排序的实现方式,对处理复杂数据集合具有重要意义。