我尝试解析一个文本文件,其中的行如下所示:
@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值。那么为什么我在这里得到例外?
答案 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()
返回String
,split(...)
返回String[]
。
因此,Arrays.asList(...)
会在此处返回List<String>
,这与您对key1
(List<Integer>
)的定义不符。
是的,您可以通过电话List<Integer>
或Integer.valueOf(...)
将其转换为Integer.parseInt(...)
。
但我建议
Arrays.asList(...)
,因为最新的实例将生成不可修改的集合。某些事情并不是你想要的:)答案 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;
}