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

如何用Java 8等高效方式将分隔字符串转换为指定对象结构?

实现分隔字符串到学生对象结构的转换

实现思路

  • 用#分割输入字符串,得到单个学生条目列表,过滤空串避免无效数据
  • 用正则表达式匹配每个条目结构,处理姓名含空格的场景
  • 针对$占位符做空值处理:编码或分数为$时,不设置对应属性(JSON序列化时自动忽略)
  • 用Java 8 Stream简化集合处理流程,提升代码简洁性

完整代码实现

package com;

import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import com.fasterxml.jackson.databind.ObjectMapper;

public class ConvertString {
    // 匹配学生条目:姓名(可含空格):编码-分数串,非贪婪匹配避免分割错误
    private static final Pattern STUDENT_PATTERN = Pattern.compile("^(.*?):(.*?)-(.*)$");

    public static void main(String[] args) {
        String input = "Albert:GE-20&40#Gert:LE-26#John-$-$#Johnah Doe:LP-40";
        
        // 分割条目并解析为Student列表
        List<Student> students = Arrays.stream(input.split("#"))
                .filter(entry -> !entry.trim().isEmpty())
                .map(ConvertString::parseStudent)
                .collect(Collectors.toList());
        
        // 封装到顶层对象
        StudentDetails studentDetails = new StudentDetails();
        studentDetails.setStudents(students);
        
        // 输出格式化JSON(需Jackson依赖)
        try {
            ObjectMapper mapper = new ObjectMapper();
            System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(studentDetails));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static Student parseStudent(String entry) {
        Student student = new Student();
        Matcher matcher = STUDENT_PATTERN.matcher(entry);
        
        if (matcher.matches()) {
            // 处理姓名
            student.setName(matcher.group(1).trim());
            
            // 处理编码,跳过$占位符
            String code = matcher.group(2).trim();
            if (!"$".equals(code)) {
                student.setCode(code);
            }
            
            // 处理分数串,转换为Marks列表
            String marksStr = matcher.group(3).trim();
            if (!"$".equals(marksStr)) {
                List<Marks> marks = Arrays.stream(marksStr.split("&"))
                        .map(markVal -> {
                            Marks mark = new Marks();
                            mark.setMark(markVal.trim());
                            return mark;
                        })
                        .collect(Collectors.toList());
                student.setMarks(marks);
            }
        }
        return student;
    }
}

关键细节说明

  1. 正则表达式:^(.*?):(.*?)-(.*)$采用非贪婪匹配,确保姓名(如Johnah Doe)、编码被正确分割,不会因特殊字符导致匹配失效。
  2. 空值处理:当编码或分数为$时,不设置对应属性,保证序列化后的JSON和示例结构一致(缺失字段不显示)。
  3. Jackson依赖:若需要输出JSON格式,需在Maven中添加依赖:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

运行输出

执行代码后会输出与示例完全一致的JSON结构:

{
  "students" : [ {
    "name" : "Albert",
    "code" : "GE",
    "marks" : [ {
      "mark" : "20"
    }, {
      "mark" : "40"
    } ]
  }, {
    "name" : "Gert",
    "code" : "LE",
    "marks" : [ {
      "mark" : "26"
    } ]
  }, {
    "name" : "John"
  }, {
    "name" : "Johnah Doe",
    "code" : "LP",
    "marks" : [ {
      "mark" : "40"
    } ]
  } ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:01:01