java - чтение строк ввода и вывод дубликатов - PullRequest
0 голосов
/ 21 сентября 2019

Итак, я учусь читать текстовые файлы и тому подобное, и я пытаюсь создать программу, которая читает входные данные по одной строке за раз и выводит текущую строку, если и только если она меньше любой другой строки, такдалеко.Меньше по отношению к обычному порядку в строках, как определено String.compareTo ().

Когда я пытаюсь запустить свой код, я получаю ошибки «Список не может быть разрешен для типа» и «ArrayList можетне разрешаться к типу ".Я не понимаю, почему я получил эту ошибку в моей программе, и мне было интересно, есть ли что-то еще, что я должен использовать?

package comp;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashSet;

public class Part2 {

    public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
        List<String> allStrings = new ArrayList<>();

        String line;
        String shortest = allStrings.get(0);
        while((line = r.readLine()) != null) {
            for(String s: allStrings) {
                if(s.length()>shortest.length()) {
                    shortest = s;
                    line = shortest;
                }
            }
            allStrings.add(line);

            for (String text: allStrings) {
                w.println(text);
            }
        }
    }

    public static void main(String[] args) {
        try {
            BufferedReader r;
            PrintWriter w;
            if (args.length == 0) {
                r = new BufferedReader(new InputStreamReader(System.in));
                w = new PrintWriter(System.out);
            } else if (args.length == 1) {
                r = new BufferedReader(new FileReader(args[0]));
                w = new PrintWriter(System.out);                
            } else {
                r = new BufferedReader(new FileReader(args[0]));
                w = new PrintWriter(new FileWriter(args[1]));
            }
            long start = System.nanoTime();
            doIt(r, w);
            w.flush();
            long stop = System.nanoTime();
            System.out.println("Execution time: " + 10e-9 * (stop-start));
        } catch (IOException e) {
            System.err.println(e);
            System.exit(-1);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Ну, здесь есть пара проблем.Если бы вы запустили свой код, вы бы получили IndexOutOfBoundException в doIt(), потому что ваш список allStrings пуст и, следовательно, когда вы звоните String shortest = allStrings.get(0);, вы вызываете что-то, чего нет в вашем списке.

Кроме того, логика if(s.length()>shortest.length())) немного странная, поскольку по сути вы действительно сравниваете только строки в вашем списке, а не с тем, что вы прочитали из файла.Следовательно, вы никогда не определите, является ли строка, которую вы прочитали из файла, на меньше , чем любая из строк, которые у вас уже есть.

Наконец, этот код ... for (String text: allStrings) {w.println(text); } ... для записи вашего файла находится в цикле, следовательно, вы записываете String каждую итерацию цикла.

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

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    List<String> shortestStrings = new ArrayList<>();

    String line = r.readLine();
    shortestStrings.add(line);

    while(line != null) {
        boolean isShortert = Boolean.TRUE;
        for(String s: shortestStrings) {
            if(line.length() > s.length()) {
                isShortert = Boolean.FALSE;
            }
        }
        if(isShortert) {
            shortestStrings.add(line);
        }
        line = r.readLine();
    }

    for (String text: shortestStrings) {
        w.println(text);
    }
}
0 голосов
/ 21 сентября 2019

Вы можете просто использовать целое число для минимальной длины:

public class Part2 {

    public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
        List<String> allStrings = new ArrayList<String>();
        String line;
        int minLength = 0;
        while ((line = r.readLine()) != null) {
            if (minLength == 0 || minLength > line.length()) {
                allStrings.add(line);
                minLength = line.length();
            }
        }

        for (String text : allStrings) {
            w.println(text);
        }
    }

    public static void main(String[] args) {
        try {
            BufferedReader r;
            PrintWriter w;
            if (args.length == 0) {
                r = new BufferedReader(new InputStreamReader(System.in));
                w = new PrintWriter(System.out);
            } else if (args.length == 1) {
                r = new BufferedReader(new FileReader(args[0]));
                w = new PrintWriter(System.out);
            } else {
                r = new BufferedReader(new FileReader(args[0]));
                w = new PrintWriter(new FileWriter(args[1]));
            }
            long start = System.nanoTime();
            doIt(r, w);
            w.flush();
            long stop = System.nanoTime();
            System.out.println("Execution time: " + 10e-9 * (stop - start));
        } catch (IOException e) {
            System.err.println(e);
            System.exit(-1);
        }
    }
}

Входной файл :

1111111
222222222
3333333333
444

Вывод :

1111111
444

Также в вашем коде есть следующая ошибка:

    List<String> allStrings = new ArrayList<>();

 // It throws IndexOutOfBoundsException!!!
    String shortest = allStrings.get(0);
...