【问题标题】:Convert String into ArrayList<MyClass>将字符串转换为 ArrayList<MyClass>
【发布时间】:2014-09-19 19:21:28
【问题描述】:

我想像这样转换String myString

[ ["cd",5,6,7], ["rtt",55,33,12], ["by65",87,87,12] ]

转为ArrayList&lt;CustomClass&gt;

CustomClass 有构造函数:

public CustomClass (String name, int num1, int num2, int num3)

我首先尝试创建ArrayList of Strings

List<String> List = new ArrayList<String>(Arrays.asList(myString.split("[")));

对我没用...

我怎样才能得到这样的东西:

List - {CustomClass,CustomClass,CustomClass,CustomClass}

第一个CustomClass = CustomClass.name="cd" , CustomClass.num1=5,CustomClass.num2=7...

第二个CustomClass = CustomClass.name="rtt",CustomClass.num1=55,CustomClass.num2=55...

等等……

【问题讨论】:

  • “对我没用...” 怎么没用?你期望从你的 split 命令中得到什么与你实际得到的不同?当您的对象数据用逗号分隔时,为什么首先要拆分“[”?
  • 另外,自定义解析并不是世界上最简单的事情。有什么方法可以让你的输入字符串以 JSON 等通用格式提供给你?然后,您可以使用现成的解析器(例如 Gson)来构建您的对象。
  • 我添加了我想要得到的结果 - 一个 List ob objects
  • String#split() 返回String 的数组。无法从该函数中获取List&lt;CustomClass&gt;。您将需要编写某种解析器/构建器。
  • 您是否考虑过编写自己的简单解析器(检查您是否在嵌套的[...] 中,读取以, 分隔的每个字段,直到找到关闭的])。你的正则表达式可以为你省去很多麻烦。

标签: java collections


【解决方案1】:

你可以做类似的事情。如果您不能保证字符串格式,那么您可能需要添加额外的拼接数组长度和索引检查。

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class CustomClass {
    String name;
    int num1;
    int num2;
    int num3;

    public CustomClass(String name, int num1, int num2, int num3) {
        super();
        this.name = name;
        this.num1 = num1;
        this.num2 = num2;
        this.num3 = num3;
    }
}

public class Sample {

    public static void main(String[] args) {
        String str = "[ [\"cd\",5,6,7], [\"rtt\",55,33,12], [\"by65\",87,87,12] ]";
        Pattern p = Pattern.compile("\\[(.*?)\\]");
        Matcher m = p.matcher(str.substring(1));
        List<CustomClass> customList = new ArrayList<CustomClass>();
        while (m.find()) {
            String[] arguments = m.group(1).split(",");
            customList.add(new CustomClass(arguments[0], 
                                            Integer.parseInt(arguments[1]), 
                                            Integer.parseInt(arguments[2]), 
                                            Integer.parseInt(arguments[3])));
        }
    }

}

Gson 解决方案

public static void main(String[] args) {
    String json = "[ [\"cd\",5,6,7], [\"rtt\",55,33,12], [\"by65\",87,87,12] ]";
    List<CustomClass> customList = new ArrayList<CustomClass>();
    String[][] data = new Gson().fromJson(json, String[][].class);
    for (String[] strArray : data){
        customList.add(new CustomClass(strArray[0], 
                Integer.parseInt(strArray[1]), 
                Integer.parseInt(strArray[2]), 
                Integer.parseInt(strArray[3])));
    }
    System.out.println(customList);
}

【讨论】:

  • 谢谢@Syam S,这个解决方案比使用 JSONArray 更好吗?
  • 如果它是一个 json 字符串,那么最好使用 json 数组。然后,您可以使用标准的 json 解析器(如 gson 或 jackson)在 2 或 3 行中创建它。
  • 它是一个 SOAP 响应,但响应只是一个参数,它是我显示的字符串 [[data],[data]... ] 所以我不知道会是什么最适合它......它真的是gson中的2-3行吗?你能展示一下它是如何实现的吗
  • 这取决于你的json数据如何。 gson 可以将 json 字符串直接读取到自定义对象列表中,但为此我们需要具有字段名称和所有内容。在您的情况下,它不会像 2-3 行那么简单。如果它只是来自 SOAP 响应的响应字符串,您可能可以按照上述程序进行操作。
  • 更新了我的答案。这是将字符串作为 json 处理的一种方法。或者,您可以编写一个自定义反序列化器,在这种情况下可能有点过头了。
【解决方案2】:

这是一个快速的“手动”解析器。

public static List<CustomClass> parseString(String str) {
    String [] elements = str.split("\\[");
    List <CustomClass> result = new ArrayList<CustomClass>();

    for (String elem : elements) {
        if (elem.contains("]")) {
            String seq = elem.substring(0, elem.indexOf(']'));
            String [] tokens = seq.split(",");
            result.add(new CustomClass(tokens[0].substring(1,tokens[0].length()-1),
                    Integer.parseInt(tokens[1]), 
                    Integer.parseInt(tokens[2]),
                    Integer.parseInt(tokens[3])));
        }
    }

    return result;
}

请注意,我依赖于保证正确输入。您可能需要根据需要调整这个。

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 2012-04-28
    • 1970-01-01
    • 2011-09-13
    • 2015-07-22
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多