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

Java按条件为JSONArray追加null的实现需求求助

问题:调整学生成绩统计JSON数据格式以符合固定长度数组要求

需求说明

需要生成固定长度(max_count=5)的JSON数据结构,分别对应及格(Passed)和不及格(Failed)学生的成绩数组,具体规则如下:

不及格(Failed)数据数组规则

  • 若不及格学生数 < 5:在数组开头补充null,直到数组长度为5
  • 若不及格学生数 ≥ 5:保留最新的5条数据(按studentID降序排序)
  • 若无不及格学生:数组全部填充null

及格(Passed)数据数组规则

  • 需在数组末尾补充null,保持总长度为5;补充的null数量需匹配对应不及格数据的有效长度(最终数组长度固定为5)
  • 若无不及格学生且及格学生数 ≥5:保留最新的5条数据(按studentID降序排序)
  • 若无及格学生:数组全部填充null

当前代码问题

当前代码在遍历学生时,每次都会新建JSONArray并仅添加单个学生成绩,导致最终data数组长度无限制,且完全没有实现规则中要求的null填充、数据截断和排序逻辑。

修改后的代码实现

以下是调整后的Java代码(基于org.json库),完全符合需求规则:

import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class StudentDataFormatter {
    public static void formatStudentData(List<StudentCategory> studentAgeCategoryList, StudentManager manager) {
        int max_count = 5;

        for (StudentCategory studentCategory : studentAgeCategoryList) {
            // 处理不及格学生数据
            List<Student> studentFailed = manager.getFailedStudent(studentCategory.getCategoryId());
            JSONObject failedData = new JSONObject();
            JSONArray failedDataArray = processFailedData(studentFailed, max_count);
            failedData.put("name", studentCategory.getCategoryName() + "Failed");
            failedData.put("data", failedDataArray);

            // 处理及格学生数据
            List<Student> studentPassed = manager.getPassStudent(studentCategory.getCategoryId());
            JSONObject passedData = new JSONObject();
            JSONArray passedDataArray = processPassedData(studentPassed, studentFailed.size(), max_count);
            passedData.put("name", studentCategory.getCategoryName() + "Passed");
            passedData.put("data", passedDataArray);

            // 可将failedData和passedData加入最终结果集合,比如:
            // resultList.add(failedData);
            // resultList.add(passedData);
        }
    }

    /**
     * 处理不及格学生数据,生成符合规则的JSONArray
     */
    private static JSONArray processFailedData(List<Student> failedStudents, int maxCount) {
        JSONArray dataArray = new JSONArray();
        int studentCount = failedStudents.size();

        if (studentCount == 0) {
            // 无不及格学生,全填充null
            for (int i = 0; i < maxCount; i++) {
                dataArray.put(JSONObject.NULL);
            }
            return dataArray;
        }

        // 按studentID降序排序,取最新的maxCount条
        Collections.sort(failedStudents, Comparator.comparingInt(Student::getStudentID).reversed());
        List<Student> targetStudents = studentCount >= maxCount ?
                failedStudents.subList(0, maxCount) : failedStudents;

        // 数据量小于maxCount时,开头补null
        int nullCount = maxCount - targetStudents.size();
        for (int i = 0; i < nullCount; i++) {
            dataArray.put(JSONObject.NULL);
        }

        // 添加有效成绩数据
        for (Student student : targetStudents) {
            dataArray.put(student.getTotalMark());
        }

        return dataArray;
    }

    /**
     * 处理及格学生数据,生成符合规则的JSONArray
     */
    private static JSONArray processPassedData(List<Student> passedStudents, int failedStudentCount, int maxCount) {
        JSONArray dataArray = new JSONArray();
        int passedCount = passedStudents.size();

        if (passedCount == 0) {
            // 无及格学生,全填充null
            for (int i = 0; i < maxCount; i++) {
                dataArray.put(JSONObject.NULL);
            }
            return dataArray;
        }

        // 按studentID降序排序
        Collections.sort(passedStudents, Comparator.comparingInt(Student::getStudentID).reversed());
        List<Student> targetStudents;

        if (failedStudentCount == 0) {
            // 无不及格学生且及格数≥maxCount,取前maxCount条
            targetStudents = passedCount >= maxCount ?
                    passedStudents.subList(0, maxCount) : passedStudents;
        } else {
            // 有效数据数量为maxCount - 不及格有效数,剩下的末尾补null
            int validPassedCount = maxCount - Math.min(failedStudentCount, maxCount);
            targetStudents = passedCount >= validPassedCount ?
                    passedStudents.subList(0, validPassedCount) : passedStudents;
        }

        // 添加有效成绩数据
        for (Student student : targetStudents) {
            dataArray.put(student.getTotalMark());
        }

        // 末尾补null至maxCount长度
        int nullCount = maxCount - targetStudents.size();
        for (int i = 0; i < nullCount; i++) {
            dataArray.put(JSONObject.NULL);
        }

        return dataArray;
    }

    // 假设的实体类,可根据实际项目调整
    static class StudentCategory {
        private int categoryId;
        private String categoryName;

        public int getCategoryId() { return categoryId; }
        public String getCategoryName() { return categoryName; }
    }

    static class Student {
        private int studentID;
        private int totalMark;

        public int getStudentID() { return studentID; }
        public int getTotalMark() { return totalMark; }
    }

    static class StudentManager {
        public List<Student> getPassStudent(int categoryId) { return null; }
        public List<Student> getFailedStudent(int categoryId) { return null; }
    }
}

代码说明

  1. 拆分处理逻辑:将及格和不及格数据的处理拆分为独立方法,提升代码可读性和可维护性
  2. 排序逻辑:对学生列表按studentID降序排序,确保取到最新的学生数据
  3. 严格遵循规则:
    • 不及格数据:不足5条时开头补null,超过5条时截断为最新5条
    • 及格数据:根据不及格数据的数量调整有效数据长度,末尾补null至5条;无不及格数据时按规则处理截断或填充
  4. 空值处理:使用JSONObject.NULL确保JSON输出的null符合标准格式

内容的提问来源于stack exchange,提问作者daisy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:48:54