java - выводит текст в нечувствительном к регистру порядке - PullRequest
1 голос
/ 21 сентября 2019

Итак, я новичок в Java, и в настоящее время я учусь читать текстовые файлы.Я пытаюсь создать программу, которая читает ввод по одной строке от пользователя, и когда я нажимаю Ctrl + Z, она должна выводить все строки в порядке сортировки без учета регистра.Я немного озадачен тем, как использовать коллекции, и я попытался последовать тому же примеру, который нашел в Интернете.Однако, когда я запускаю свою программу, она просто выводит все, что я ввел, ничего не сортируя.Что я делаю не так?

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    List<String> listStrings = new ArrayList<>();
    String line;
    while((line = r.readLine()) != null) {
        listStrings.add(line);
    }

    Collections.sort(listStrings);

    Collections.sort(listStrings, String.CASE_INSENSITIVE_ORDER);

    Collections.sort(listStrings, Collections.reverseOrder());

    Collections.sort(listStrings, String.CASE_INSENSITIVE_ORDER);

//  Collections.reverse(listStrings);

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

1 Ответ

1 голос
/ 22 сентября 2019

Ни один из ваших Collections._____() вызовов не напечатает ничего.Они просто оперируют базовой коллекцией (listStrings).Итак, вот что вы ожидаете получить после каждого шага:

//listStrings
Collections.sort(listStrings);
//listStrings sorted alphabetically, case sensitive
Collections.sort(listStrings, String.CASE_INSENSITIVE_ORDER);
//listStrings sorted alphabetically, case insensitive
Collections.sort(listStrings, Collections.reverseOrder());
//listStrings sorted alphabetically in reverse order, case insensitive
Collections.sort(listStrings, String.CASE_INSENSITIVE_ORDER);
//listStrings sorted alphabetically, case insensitive
Collections.reverse(listStrings);
//listStrings sorted alphabetically in reverse order, case insensitive

Наконец, после внесения всех этих изменений в listStrings вы пытаетесь распечатать коллекцию.Проблема, с которой вы здесь сталкиваетесь, заключается в том, что вы на самом деле не очищаете выходной поток, который, скорее всего, буферизуется.Итак, ничего не будет напечатано.Я переписал ваш код, чтобы иметь точно такой же эффект на listStrings, и напечатал вывод, например, так:

public static void doIt(BufferedReader r, PrintWriter w) throws IOException
{
    List<String> listStrings = new ArrayList<>();
    String line;
    while((line = r.readLine()) != null)
    {
        listStrings.add(line);
    }

    Collections.sort(listStrings, String.CASE_INSENSITIVE_ORDER.reversed());

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

Я вызываю его из моего основного метода так:

public static void main(String[] args) throws Exception
{
    doIt(new BufferedReader(new InputStreamReader(System.in)), new PrintWriter(System.out));
}

Вот результат:
Ввод:

ABCD
bcde
fegh
ijkl

Ввод:

ijkl
fegh
bcde
ABCD
...