繁体   English   中英

如何在 Java 中将整数字符串转换为 ArrayList?

[英]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()返回一个Stringsplit(...)返回一个String[] 因此Arrays.asList(...)在这里返回一个List<String> ,这与您对key1List<Integer> )的定义不兼容。

是的,您可以通过调用Integer.valueOf(...)Integer.parseInt(...)将其转换为List<Integer>

但我会建议

  1. 使用 List 的新实例而不是Arrays.asList(...)因为最新的实例会产生一个不可修改的集合。 有时这不是你想要的:)
  2. 使用比您自己的文本格式更不具体的内容。 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM