在Java中如何将整数字符串转换为ArrayList?
我尝试解析一个文本文件,其中的行如下所示:在Java中如何将整数字符串转换为ArrayList?,java,arraylist,type-conversion,Java,Arraylist,Type Conversion,我尝试解析一个文本文件,其中的行如下所示: if(line.startsWith("@KEY")){ List<String> channelTemp = Arrays.asList(line.replace("@KEY,", "").replace("_", "1").split("\\s*,\\s*")); channelTemp.forEach(item -> metaObject.channel.add(Integer.pars
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");
}
@键,0,1,2,4,5,6,…
@键在开头只是一个标识符,而下面的数字是我要存储在数组列表中的数据
我有一个元数据类,其中包含要在其中插入整数的arraylist:
class MetaD {
public List<Integer> key1, key2, key3 = new ArrayList<Integer>();
}
我发现这不适用于ArrayList
key1
必须是ArrayList
或ArrayList
类型才能工作
有没有办法用同样的方法转换整数?
如果不是,我的想法如下:
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");
}
- 将所有内容转换为
ArrayList
- 迭代这个新的
ArrayList
的每一项,并使用Integer.parseInt()
将其转换为整数
- 将此新整数添加到my
ArrayList
有没有更有效或更好的方法来归档我的需求
编辑:
由于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");
}
if(line.startsWith(“@KEY”)){
List channelTemp=Arrays.asList(line.replace(“@KEY,”).replace(“\u1”).split(“\\s*,\\s*”);
channelTemp.forEach(item->metaObject.channel.add(Integer.parseInt(item));
系统输出打印项次(“完成”);
}
不幸的是,这会在第三行抛出一个NullPointerException
,我不知道为什么。出于测试目的,我将替换为1
,以避免出现NumberFormatException
。当我打印lambda函数中的每个对象而不是将它们添加到我的ArrayList
时,我可以看到所有项都有一个整数值。那我为什么会有例外呢?既然你快到了,我就帮你一把
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);
您试图在整数列表中放入一个字符串:
metaObject.key1 = Arrays.asList(line.replace("@KEY,", "").replace("_", "").trim().split("\\s*,\\s*"));
此处为行。替换(…)
和trim()
返回字符串
,拆分(…)
返回字符串[]
。
因此,Arrays.asList(…)
在此返回一个列表
,该列表与您对key1
(List
)的定义不兼容
是的,您可以通过调用Integer.valueOf(…)
或Integer.parseInt(…)
将其转换为List
但我建议你
使用List的新实例,而不是Arrays.asList(…)
,因为最新的实例将生成不可修改的集合。有时这不是你想要的:)
使用比您自己的文本格式更不具体的内容。那么JSON呢?有很多库可以简化数据的解析/存储
首先,您应该使用“,”分割字符串,然后使用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;
}
publicstaticvoidmain(字符串[]args)引发IOException{
String str=“@KEY,0,1,2,4,5,9”;
字符串[]strArr=str.split(“,”);
List intList=new ArrayList();
for(字符串:strArr){
if(isInteger(字符串,10)){
add(Integer.valueOf(string));
}否则{
System.out.println(字符串+“不是整数”);
}
}
System.out.println(intList.toString());
}
公共静态布尔isInteger(字符串s,整数基数){
如果(s.isEmpty())返回false;
对于(int i=0;i
你的想法几乎是实现这一目标的唯一途径。如果您使用的是Java8,那么可以使用流操作来简化这个过程。您应该使用Integer.valueOf
,因为它将直接创建一个Integer
,而不涉及装箱(Integer.parseInt
返回一个int
而不是Integer
),谢谢!这会过滤掉所有的空值吗?这对我来说非常糟糕,因为我想将这些数据存储在数据库中,这是我的列(其中一些值可以为NULL)。但是我想我可以用你的答案来回答我的问题,我只需要用-1
或类似的内容来替换“
”。谢谢:)后续问题:既然ArrayList
允许元素为null
,那么是否可以用Java的null
替换?类似于.replaceAll(“25;”,null)
的东西不起作用。@Drudge这里有一个可能的管道。谢谢,你的答案非常有效!是否有理由将.replaceAll
替换为.skip
?你能给我解释一下.collect(Collectors.toList())
到底做什么吗?这是你的代码中唯一我不理解的部分。@Drudge,因为正则表达式非常昂贵。因此不需要替换字符,我可以说如果字符串以@KEY
开头,那么跳过第一个条目Stream::collect
用于将流中的对象收集到特定的数据结构中,在本例中,它是一个列表。