Быстрый способ чтения большого массива из консоли с ограничением памяти - PullRequest
0 голосов
/ 06 июня 2019

У меня есть данные теста:

public class InputTest {

    @Before
    public void setUp() throws Exception {
        ByteArrayInputStream in = new ByteArrayInputStream("90 22 11 4 5\n".getBytes());
        System.setIn(in);
    }

и мне нужно прочитать каждую цифру из InputStream как целое число. Я создаю этот тест:

@Test
public void read() throws IOException {
    int c;
    while ((c = System.in.read()) != '\n') {
        int i = readInt(c);
        if (i != -1)
            System.out.print(i);
    }
}

private static int readInt(int c) {
    int ret = 0;
    if (c >= '0' && c <= '9') {
        return ret * 10 + c - '0';
    }
    return -1;
}

И у меня есть такой вывод: 90221145 - я печатаю каждый int на консоль. Но мне нужны отдельные цифры, как в исходной строке - 90 22 11 4 5

Я могу изменить его на:

@Test
public void read() throws IOException {
    int c;
    StringBuilder b = new StringBuilder();
    while ((c = System.in.read()) != '\n') {
        int i = readInt(c);
        if (i != -1) {
            b.append(i);
        }else {
            b.append(" ");
        }
    }
    System.out.println(b.toString());
}

private static int readInt(int c) {
    int ret = 0;
    if (c >= '0' && c <= '9') {
        return ret * 10 + c - '0';
    }
    return -1;
}

Но я не хочу создавать StringBuilder на каждом шаге. Как я могу это сделать?

P.S Я знаю о BufferedReader's readLine() методе и StringTokinizer, и это не подходит. Мне нужно прочитать байты. Я решаю проблемы с хранением этих данных и мне нужно только быстрое чтение.

Это пример задачи интервью, и мне нужно прочитать большой массив значений с ограничениями памяти.

1 Ответ

0 голосов
/ 06 июня 2019

Как насчет записи его в System.out, пока вы читаете данные

@Test
public void read() throws IOException {
    int c;
    StringBuilder b = new StringBuilder();
    while ((c = System.in.read()) != '\n') {
        int i = readInt(c);
        if (i != -1) {
            System.out.print(""+i);
        }else {
            System.out.print(" ");
        }
    }
    System.out.print("\n"); // end of line
}
...