[英]How to convert a String of Integers to an ArrayList in Java?
我尝试解析一个文本文件,该文件的行如下所示:
@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()
将其转换为 Integer。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 值。 那么为什么我在这里得到一个例外?
既然你快到了,我就帮你一把。
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());
您正在尝试将 Integer 列表放入字符串中:
metaObject.key1 = Arrays.asList(line.replace("@KEY,", "").replace("_", "").trim().split("\\s*,\\s*"));
这里line.replace(...)
和trim()
返回一个String
, split(...)
返回一个String[]
。 因此Arrays.asList(...)
在这里返回一个List<String>
,这与您对key1
( List<Integer>
)的定义不兼容。
是的,您可以通过调用Integer.valueOf(...)
或Integer.parseInt(...)
将其转换为List<Integer>
。
但我会建议
Arrays.asList(...)
因为最新的实例会产生一个不可修改的集合。 有时这不是你想要的:)首先,你应该用“,”分割你的字符串,然后你用 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.