Как я могу изменить этот код для обработки входного текста с символами и целыми числами? - PullRequest
4 голосов
/ 04 апреля 2019

Я пытаюсь взять входной файл .txt, который содержит символы и целые числа, и читаю только целые числа, чтобы я мог выполнять вычисления.Этот код работает, когда мой входной файл .txt содержит только целые числа, разделенные пробелами и запятыми, но не работает, когда я добавляю символы.

Файл образца:

Student A: 90, 85, 70, 95
Student B: 65, 75, 90, 90
Student C: 80, 80, 75, 85
Student D: 100, 75, 80, 75

public class test {

    public static void ReadScore (String[] args) {
        List<Integer> listIntegers = new ArrayList<>();
        File f = new File("input2.txt"); {
            try (Scanner sc = new Scanner(f)) {
                while (sc.hasNextLine()) {
                    String line = sc.nextLine();
                    String[] tokens = line.split("\\s*,\\s*");
                    for (String token : tokens) {
                        listIntegers.add(Integer.parseInt(token));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            finally {System.out.println(listIntegers); }
        }}

    public static void main (String[] args) {
        test.ReadScore(args);
    }
}

Когда образец.TXT-файл содержит только целые числа, я получил бы такой результат:

[90, 85, 70, 95, 65, 75, 90, 90, 80, 80, 75, 85, 100, 75, 80, 75]

Однако, когда вводится «Student A:» и т. д., я не уверен, как с этим справиться, и я получаю IOExceception, как:

java.lang.NumberFormatException: For input string: "Jeff: 10"
    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 test.ReadScore(test.java:17)
    at test.main(test.java:27)
[]

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Вы получаете java.lang.NumberFormatException, потому что вы пытаетесь проанализировать Integer из String. Чтобы получить только цифры в качестве вывода, вам нужно удалить все дополнительные строки, кроме чисел. Попробуйте это:

String[] tokens = line.replaceAll("[^0-9,.]", "").split("\\s*,\\s*");

Надеюсь, это поможет.

0 голосов
/ 04 апреля 2019

Исключение довольно очевидно, вы не можете преобразовать

Джефф: 10

в целое число ...

Вы можете использоватьregex и захватывать ТОЛЬКО числовую часть ....

public static void main(String[] args)  {
    String n = "Student A: 90, 85, 70, 95";

    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(n);
    while(m.find()){
        System.out.println(m.group());
    }
}

этот код напечатает

90 85 70 95

что-то вроде:

    String n = "Student A: 90, 85, 70, 95";
    List<Integer> l = new ArrayList<>();
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(n);
    while(m.find()){
        //System.out.println(m.group());
        l.add(Integer.parseInt(m.group()));
    }
    System.out.println("L:" + l);
0 голосов
/ 04 апреля 2019

Самый простой способ - конвертировать ваш входной файл в полную версию CSV. Студент А, М1, М2 ..

Если вы не можете этого сделать, вам придется удалить имя студента из строки ввода, а затем разбить строку, используя запятую в качестве разделителя.

Псевдокод выглядит так line = line.substring (line.indexOf (':') + 1);

Надеюсь, это поможет.

...