【问题标题】:Convert Delimitted String to Object Structure将分隔字符串转换为对象结构
【发布时间】:2022-11-10 13:31:22
【问题描述】:

我有一个分隔字符串:“Albert:GE-20&40#Gert:LE-26#John-$-$#Johnah Doe:LP-40”。

名称:代码-Mark1&Mark2&Mark3#

其中,Albert 是名称,GE 是代码,20&40 是用 & 分隔的标记。不同的条目用# 分隔。如果任何数据不存在,则 $ 会出现在它的位置。前任。对于 John,代码和标记不存在,因此它们被替换为 $。

下面是我要模拟的对象结构:

{
"students":[{
"name": value,
"code":value,
"marks":[{"mark":value}]}]
}

所以上面的例子应该转化为:

{
"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"}]}
]
}

我试图使用 ConvertString.java 来执行此操作,但被卡住了。我该怎么做呢?理想情况下使用 Java 8 流/正则表达式/库/任何其他有效方式。请帮忙。

StudentDetails.java

package com;

import java.util.List;

public class StudentDetails {
    List<Student> students;

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

}

学生.java

package com;

import java.util.List;

public class Student {
    String name;
    String code;
    List<Marks> marks;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public List<Marks> getMarks() {
        return marks;
    }

    public void setMarks(List<Marks> marks) {
        this.marks = marks;
    }

}

标记.java

package com;

public class Marks {
    String mark;

    public String getMark() {
        return mark;
    }

    public void setMark(String mark) {
        this.mark = mark;
    }

}

转换字符串.java

package com;

import java.util.ArrayList;
import java.util.List;

public class ConvertString {
    public static void main(String args[])
    {
        String input="Amar:GE-20&40#Gert:LE-26#John-$-$#Johnah Doe:LP-40";
        String newInput="#"+input+"#";
        List<String> list1 = new ArrayList()<String>(Arrays.asList(newInput.split("#")));

}
}

【问题讨论】:

    标签: java regex spring spring-boot java-8


    【解决方案1】:

    使用 JDK 17:

    我已经使用除 Java 8 之外的一些最新 Java 功能实现了以下代码。

    java 14 中的记录:从 JDK 14 开始,我们可以替换我们的数据类 与记录。Records are immutable classes只需要类型 和字段名称。我们不需要创建构造函数、getter、 设置器,覆盖 toString() 方法,覆盖哈希码和等于 方法。

    下面的代码将输入字符串转换为对象结构。

    public class Test {
      public static void main(String[] args) throws JsonProcessingException {
    
        String input = "Albert-GE-20&40#Gert-LE-26#John-$-$#John Doe-LP-40#";
    
        record Marks(String mark){}
        record Student(String name, String code, List<Marks> marks){}
        record Response(List<Student> students){}
    
        List<Student> students = new ArrayList<>();
        Arrays.asList(input.split("#")).forEach(student -> {
    
          String[] splitArr1 = student.split("-");
          String[] splitArr2 = splitArr1[2].split("&");
    
          String name = splitArr1[0];
          String code = splitArr1[1].contains("$")?null:splitArr1[1];
          List<Marks> marks = Arrays.stream(splitArr2).filter(y -> !y.contains("$")).map(Marks::new).toList();
    
          Student s = new Student(name,code,marks);
          students.add(s);
        });
        Response out = new Response(students);
    
        System.out.println(out); // Back to Object structure
      }
    }
    

    输出::

    Response[students=[Student[name=Albert, code=GE, marks=[Marks[mark=20], Marks[mark=40]]], Student[name=Gert, code=LE, marks=[Marks[mark=26]]], Student[name=John, code=null, marks=[]], Student[name=John Doe, code=LP, marks=[Marks[mark=40]]]]]
    

    【讨论】:

      【解决方案2】:

      我认为这是解决此问题的最简单方法:

      for(list:list1) 
      {
      
          List<String> list2 = new ArrayList()<String>
          
          (Arrays.asList(list.split(":")));
          
          student.getname(list[0]);
          
          List<String> list3 = new ArrayList()<String>
          
          (Arrays.asList(list2[1].split("-")));
          
          student.getcode(list3[0]);
          
          List<String> listmask = new ArrayList()<String>
          
          (Arrays.asList(list3[1].split("&")));
          
          for(mask:listmask)
          
          {
              student.masks.add(mask);
          }
          
      }
      

      希望这对你有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-28
        • 2013-05-06
        • 2021-06-26
        • 2021-12-03
        • 1970-01-01
        • 2011-12-15
        相关资源
        最近更新 更多