You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:25:39