Как я могу читать только n строк одновременно и печатать в обратном Java - PullRequest
0 голосов
/ 25 сентября 2018

Моя цель - читать только 50 строк за раз из текстового файла, печатать их в обратном порядке и хранить только 50 строк за раз в памяти.Наиболее эффективным из возможных способов.

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

Фактический вывод: он печатает строки 50 в строку 1, строки 101 в строку 52 (пропускается строка 51), строки 104 - 103 (пропускается строка 102),

Ожидаемый результат: Строка 50 - Строка 1, Строка 101 - Строка 51, Строка 104-102.

Я также не знаю, как изменить первый цикл while, чтобы он продолжал работать доконец файла, так как тестирование while (r.readLine! = null) также не сработало.

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    Stack<String> s = new Stack<String>();
    int i = 0;
    int x = 0;


    while (x < 5) {
        for (String line = r.readLine(); line != null && i < 50; line = r.readLine()) {
            s.push(line);
            i++;
        }

        i = 0;

        while (!s.isEmpty()) {
            w.println(s.pop());

        }

        x++;

    }



}

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Ok Сначала все в порядке

for (String line = r.readLine(); line != null && i < 50; line = r.readLine()) 

Этот цикл for читает еще раз, достигая 50. Это основная причина дополнительной строки.

Я также не знаю, как изменить первый цикл while, чтобы он продолжал работать до конца файла

Это потому, что вы делаете это неправильно.Я сделал макет для печати желаемого поведения:

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    Stack<String> s = new Stack<String>();
    int i = 0;
    int x = 0;
    String strLine;
    while ((strLine = r.readLine()) != null){ // Read until end of File
        s.push(strLine); // add to the Stack
        i++;
        if(i==50) // Print if is equal to 50
        {
            while (!s.isEmpty()) {
                System.out.println(s.pop());
            }
            i=0;
        }
    }

    while (!s.isEmpty()) {
        System.out.println(s.pop()); // Print the last numbers
    }
}
0 голосов
/ 25 сентября 2018

Вы можете использовать lines() для создания потока из BufferedReader, а затем взять только 50 элементов.что-то вроде

List<String> lines = r.lines().limit(50).collect(toList());

, а затем вы можете выполнять итерации из списка и печатать строки;

for(int i = lines.size()-1; i >= 0; --i) {
   System.out.println(lines.get(i));
}
0 голосов
/ 25 сентября 2018

Похоже, так как вы добавили

line = r.readLine()

в итерацию, строка проверяется перед проверкой

line != null && i < 50

, которая вызывает чтение строки, а не iдля проверки на i <50 и, поскольку i действительно меньше 50, строка не помещается в стек, и мы забываем об этом, как только мы выберемся из блока for.</p>

Попробуйте повторить строку внутри блока for.Вы все еще можете сохранить условие для строки! = Null в блоке for, если хотите.

Cheers!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...