如何在Java中将整数字符串转换为ArrayList?

时间:2015-10-04 17:37:41

标签: java arraylist type-conversion

我尝试解析一个文本文件,其中的行如下所示:

@KEY,_,0,1,2,_,4,5,6, ...

@KEY只是开头的标识符,而以下数字是我想要存储在ArrayList<Integer>中的数据。

我有一个元数据类,其中包含我想在其中插入整数的arraylist:

class MetaD {
    public List<Integer> key1, key2, key3 = new ArrayList<Integer>();
}

我逐行解析文本文件;当该行以@KEY开头时,我想将这些元素添加到key1列表中。如果有_,则应将其替换为空值:

    if(line.startsWith("@KEY")){
        metaObject.key1 = Arrays.asList(line.replace("@KEY,", "").replace("_", "").trim().split("\\s*,\\s*"));
    }

我发现这不适用于ArrayList<Integer>key1必须属于ArrayList<String>ArrayList<Object>类型才能使其有效。

有没有办法以相同的方式转换整数? 如果没有,我的想法如下:

  • 将所有内容转换为ArrayList<String>
  • 迭代此新ArrayList的每个项目,并将其与Integer.parseInt()转换为整数。
  • 将此新整数添加到我的ArrayList<Integer>

是否有更高效或更好的方式来存档我的需求?

修改 自从Tunaki在评论中写道,我的想法可能是我尝试做以下事情的唯一可行方式:

    if(line.startsWith("@KEY")){
        List<String> channelTemp =  Arrays.asList(line.replace("@KEY,", "").replace("_", "1").split("\\s*,\\s*"));
        channelTemp.forEach(item -> metaObject.channel.add(Integer.parseInt(item)));
        System.out.println("done");
    }

不幸的是,这会在第三行引发NullPointerException,我不知道为什么。我将_替换为1用于测试目的,以避免使用NumberFormatException。当我打印出lambda函数中的每个对象而不是将它们添加到我的ArrayList<Integer>时,我可以看到所有项都有一个Integer值。那么为什么我在这里得到例外?

3 个答案:

答案 0 :(得分:2)

因为你几乎在那里我会帮你一把。

String line = "@KEY,_,0,1,2  , _,4,5,6,";
List<Integer> collect = Arrays.stream(line.replaceAll("@KEY|_", "").split(","))
        .map(String::trim)
        .filter(s -> !s.isEmpty())
        .map(Integer::valueOf).collect(Collectors.toList());
System.out.println(collect);

修改

要获得null,您可以改变映射过程,如:

List<Integer> collect = Arrays.stream(line.split(","))
        .skip(line.startsWith("@KEY") ? 1 : 0)
        .map(String::trim)
        .filter(s -> !s.isEmpty())
        .map(s -> "_".equals(s) ? null : Integer.valueOf(s)).collect(Collectors.toList());

答案 1 :(得分:0)

您尝试将整数列表放入字符串:

metaObject.key1 = Arrays.asList(line.replace("@KEY,", "").replace("_", "").trim().split("\\s*,\\s*"));

此处line.replace(...)trim()返回Stringsplit(...)返回String[]。 因此,Arrays.asList(...)会在此处返回List<String>,这与您对key1List<Integer>)的定义不符。

是的,您可以通过电话List<Integer>Integer.valueOf(...)将其转换为Integer.parseInt(...)

但我建议

  1. 使用List的新实例而不是Arrays.asList(...),因为最新的实例将生成不可修改的集合。某些事情并不是你想要的:)
  2. 使用比您自己的文字格式更不具体的内容。 JSON怎么样?有许多库可以简化数据的解析/存储。

答案 2 :(得分:0)

首先,你应该用“,”分割你的字符串,然后尝试你的每个字符串是否为整数或不具有isIntegerMethod。如果是整数,则可以将其添加到列表中。

public static void main(String[] args) throws IOException {
    String str = "@KEY,_,0,1,2,_,4,5,9";
    String [] strArr = str.split(",");
    List<Integer> intList = new ArrayList<Integer>();
    for (String string : strArr) {
        if (isInteger(string, 10)) {
            intList.add(Integer.valueOf(string));
        } else {
            System.out.println(string + " is not an integer");
        }
    }
    System.out.println(intList.toString());

}

public static boolean isInteger(String s, int radix) {
    if(s.isEmpty()) return false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s.charAt(i) == '-') {
            if(s.length() == 1) return false;
            else continue;
        }
        if(Character.digit(s.charAt(i),radix) < 0) return false;
    }
    return true;
}