【问题标题】:Error trying to convert a List<String> to List<Integer>尝试将 List<String> 转换为 List<Integer> 时出错
【发布时间】:2020-02-17 22:28:24
【问题描述】:

我目前正在尝试使用流等将List&lt;String&gt; 转换为List&lt;Integer&gt;。但我不知道发生了什么;当它运行时,它给了我一些让我发疯的错误。

我已经尝试了我(不太了解)从 Java 中的 Streams 中了解的所有内容,也尝试过不使用它们,但问题是我想以一种功能性的方式实现它。 我给我的方法 (leeFichero) 一个字符串 f,它就是我的 txt 文件的路径。我想要的方法就是返回一个List&lt;Integer&gt;,其中包含其中的值。 文件内容是这样的:

-3,-2,-1,0,1,2,3
1,3,5,7,9
100
2,4,6,8,10
 public static List<Integer> leeFichero(String f) {
    List<String>lineas=null;
    try {
        BufferedReader bf = new BufferedReader(new FileReader(f));
        lineas = bf.lines().collect(Collectors.toList());
        bf.close();
    } catch (IOException e) {
        System.out.println(e.toString());
    }
    List<Integer> intList = lineas.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());

    return intList;
} 

当我运行它时,它给了我这个错误信息:

Exception in thread "main" java.lang.NumberFormatException: For input string: "-3,-2,-1,0,1,2,3"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at ejercicios.ejercicio1.lambda$0(ejercicio1.java:108)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at ejercicios.ejercicio1.leeFichero(ejercicio1.java:108)
at ejercicios.ejercicio1.main(ejercicio1.java:48)

【问题讨论】:

  • 你需要用,分割行
  • 首先阅读错误信息。它告诉你你做错了什么。您正在尝试将字符串 "-3,-2,-1,0,1,2,3" 解析为整数。合乎逻辑的结论是您解析文件的方式是错误的,因为它不是为文件中的每个整数返回一个字符串,而是返回一个包含所有整数的字符串。确实如此。您的解析逐行读取文件,但文件包含一行,其中包含许多用逗号分隔的整数。

标签: java list methods integer java-stream


【解决方案1】:

首先,我看不到您方法中的许多临时变量的用途。其次,我更喜欢编译后的Pattern 用于分割行(这里\\s* 用于消耗可能在数字和逗号之间的任何空格)。首选try-with-Resources 而非手动资源管理。然后,如前所述,使用flapMap(),然后使用map() - 但我会直接返回结果。比如,

public static List<Integer> leeFichero(String f) {
    Pattern p = Pattern.compile("\\s*,\\s*");
    try (BufferedReader bf = new BufferedReader(new FileReader(f))) {
        return bf.lines().flatMap(s -> Arrays.stream(p.split(s)))
                .map(Integer::valueOf).collect(Collectors.toList());
    } catch (IOException e) {
        System.out.println(e.toString());
    }
    return new ArrayList<>();
}

【讨论】:

    【解决方案2】:

    你应该splitString的行使用分隔符,flatMap将它们收集为一个列表。

    lineas = bf.lines()
            .flatMap(s -> Arrays.stream(s.split(",")))
            .collect(Collectors.toList());
    

    然后返回映射为的List&lt;Integer&gt;

    return lineas.stream()
            .map(Integer::parseInt)
            .collect(Collectors.toList());
    

    【讨论】:

    • 另外,将数组列表初始化为空而不是null,例如List&lt;String&gt; lineas = new ArrayList&lt;&gt;();
    猜你喜欢
    • 2010-09-06
    • 2022-09-30
    • 2012-05-29
    • 2013-08-03
    • 2023-03-26
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多