java - избегать вывода первой строки, введенной пользователем - PullRequest
1 голос
/ 25 января 2020

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

Мне было интересно, есть ли способ для программы рассмотреть первая строка а не выводить ее пользователю? Спасибо за любую помощь!

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    ArrayList<String> strings = new ArrayList<>();
    String line;
    while((line = r.readLine()) != null) {
        boolean checkIfSmaller = true;
        strings.add(line);
        for (int i = 0; i < strings.size()-1; i++) {
            if (line.compareTo(strings.get(i)) >= 0) {
                checkIfSmaller = false;
            }
        }

        if (checkIfSmaller) {
            w.println(line);
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 25 января 2020

Идея состоит в том, чтобы добавить строку в список после проверки на наличие меньших строк, поскольку сравнивать строку с самим собой не имеет смысла. Кроме того, сравнение, которое вы делаете, не правильно IMO:

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    ArrayList<String> strings = new ArrayList<>();
    String line;
    while((line = r.readLine()) != null) {
        boolean isSmaller = false;
        for (int i = 0; i < strings.size()-1; i++) {
            if (line.compareTo(strings.get(i)) < 0) {
                isSmaller = true;
                break;
            }
        }
        strings.add(line);
        if (isSmaller) {
            w.println(line);
        }
    }
}
1 голос
/ 25 января 2020

Вам не нужно вести список всех предыдущих строк. Достаточно сохранить только самую маленькую строку, с которой вы когда-либо сталкивались. Исходя из этой логики c, код может быть импровизирован следующим образом

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
        String line;
        String smallestLineSoFar = null;
        while ((line = r.readLine()) != null) {
            if (smallestLineSoFar == null) {
                // this case is for first line
                smallestLineSoFar = line;
            } else if (line.compareTo(smallestLineSoFar) < 0) {
                smallestLineSoFar = line;
                w.println(line);
            }
        }
    }
1 голос
/ 25 января 2020

Попробуйте следующий код,

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    ArrayList<String> strings = new ArrayList<>();
    String line;
    boolean checkIfSmaller = false;
    while((line = r.readLine()) != null) {
        if (checkIfSmaller) {
            w.println(line);
        }
        checkIfSmaller = false;
        strings.add(line);
        for (int i = 0; i < strings.size()-1; i++) {
            if (strings.get(i).compareTo(line) >= 0) {
                checkIfSmaller = true;
            }
        }
    }
}
...