Ошибка при попытке преобразовать список <String>в список <Integer> - PullRequest
0 голосов
/ 21 октября 2019

Я сейчас пытаюсь преобразовать List<String> в List<Integer> с потоками и так далее. Но я не знаю, что происходит;когда он запускается, это дает мне некоторые ошибки, которые сводят меня с ума.

Я уже перепробовал все, что я (плохо) знаю из потоков в Java, также пытался обойтись без них, но дело в том, что я хочусделать это функционально. Я даю своему методу (leeFichero) строку f, которая является просто путем к моему txt-файлу. И все, что я хочу, чтобы метод сделал, это вернуть List<Integer> со значениями в нем. Содержимое файла таково:

-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)

Ответы [ 2 ]

5 голосов
/ 21 октября 2019

Вы должны split строки String, используя разделитель , и flatMap, чтобы собрать их в виде списка.

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

, а затем вернуть List<Integer>, отображенное как:

return lineas.stream()
        .map(Integer::parseInt)
        .collect(Collectors.toList());
1 голос
/ 21 октября 2019

Во-первых, я не вижу назначения многих временных переменных в вашем методе. Во-вторых, я бы предпочел скомпилированный 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<>();
}
...