Java学生排序程序:如何避免或移除数组中的Null值
解决Java学生排序时的Null值问题
针对你遇到的输入中断时数组出现Null值导致排序失败的问题,有两种直接有效的解决办法:
一、从根源避免添加Null值:用动态列表替代固定长度数组
固定长度数组因为要预先分配空间,中断输入时必然会留下未填充的Null位。改用ArrayList这种动态列表,只在输入有效数据时添加元素,遇到-1直接终止输入,完全不会产生Null值,后续排序也能正常进行。
示例代码:
import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Scanner; class Student { private int id; private int score; private String lastName; private String firstName; public Student(int id, int score, String lastName, String firstName) { this.id = id; this.score = score; this.lastName = lastName; this.firstName = firstName; } // 必须的getter方法 public int getScore() { return score; } public String getLastName() { return lastName; } public String getFirstName() { return firstName; } @Override public String toString() { return "ID: " + id + " | 分数: " + score + " | 姓名: " + lastName + " " + firstName; } } public class StudentManager { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); List<Student> studentList = new ArrayList<>(); while (true) { System.out.print("输入学生ID(输入-1结束):"); int id = scanner.nextInt(); if (id == -1) break; System.out.print("输入学生分数(输入-1结束):"); int score = scanner.nextInt(); if (score == -1) break; scanner.nextLine(); // 清除输入缓冲区的换行符 System.out.print("输入学生姓氏:"); String lastName = scanner.nextLine(); System.out.print("输入学生名字:"); String firstName = scanner.nextLine(); // 只添加有效学生对象 studentList.add(new Student(id, score, lastName, firstName)); } // 按规则排序 studentList.sort(Comparator.comparingInt(Student::getScore).reversed() .thenComparing(Student::getLastName) .thenComparing(Student::getFirstName)); // 输出结果 System.out.println("\n=== 排序后的学生列表 ==="); studentList.forEach(System.out::println); scanner.close(); } }
二、如果必须用数组:排序前先过滤Null值
要是你已经基于固定长度数组开发,不想重构代码,可以在排序前先把数组里的Null元素过滤掉,只对有效学生对象排序。
方法1:用Stream API快速过滤(Java 8+)
import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; // 假设已有Student数组students,其中包含Null值 Student[] students = ...; // 过滤Null并排序 List<Student> validStudents = Arrays.stream(students) .filter(student -> student != null) // 筛掉Null元素 .sorted(Comparator.comparingInt(Student::getScore).reversed() .thenComparing(Student::getLastName) .thenComparing(Student::getFirstName)) .collect(Collectors.toList()); // 输出有效结果 validStudents.forEach(System.out::println);
方法2:手动复制到新数组(兼容低版本Java)
// 假设已有Student数组students Student[] students = ...; // 统计有效元素数量 int validCount = 0; for (Student s : students) { if (s != null) validCount++; } // 创建新数组存放有效元素 Student[] validStudents = new Student[validCount]; int index = 0; for (Student s : students) { if (s != null) { validStudents[index++] = s; } } // 对新数组排序 Arrays.sort(validStudents, Comparator.comparingInt(Student::getScore).reversed() .thenComparing(Student::getLastName) .thenComparing(Student::getFirstName)); // 输出结果 for (Student s : validStudents) { System.out.println(s); }
两种方案里,第一种用动态列表的方式更简洁高效,从根源上避免了Null值问题,推荐优先使用。
内容的提问来源于stack exchange,提问作者yasakrami
相关产品推荐
相关产品推荐

