【发布时间】:2016-01-01 09:16:48
【问题描述】:
我尝试解析一个文本文件,其中包含如下所示的行:
@KEY,_,0,1,2,_,4,5,6, ...
@KEY 只是开头的一个标识符,而以下数字是我想要存储在 ArrayList<Integer> 中的数据。
我有一个元数据类,其中包含我想在其中插入整数的数组列表:
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 在 cmets 中写道,我的想法可能是我尝试执行以下操作的唯一可能方式:
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 值。那么为什么我会在这里得到一个异常呢?
【问题讨论】:
-
你的想法几乎是实现它的唯一方法。如果您使用的是 Java 8,则可以使用 Stream 操作简化此操作。你应该使用
Integer.valueOf,因为它会直接创建一个Integer而不涉及装箱(Integer.parseInt返回一个int而不是Integer)
标签: java arraylist type-conversion