在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
    用于将流中的对象收集到特定的数据结构中,在本例中,它是一个列表。