Содержимое Process String с использованием потоков Java напрямую в массив объектов {col, row и value}? - PullRequest
0 голосов
/ 06 апреля 2020

Мне нужно какое-то руководство. Я не уверен, как go о чтении в текстовом файле примера в массив объектов, используя Java Streams. Предоставляет ли поток функциональность для правильного вывода позиции символа (координат) из строки, которую он читает из файла?

У меня есть объект ..

public class Square {
protected int row;
protected int column;
protected char val;
protected Square(int row, int column, char val) {
....
}

}

Я читаю файл, используя Java I / O, а затем передаю содержимое в виде строки этой функции, чтобы создать массив квадратов ....

`public static Square[][] buildFromString(input){
        String[] lines = input.split("[\r]?\n");
        int height = lines.length;
        int width = lines[0].length();
        int count = 0;
        Square[][] squares = new Square[height][width];

        for (int row = 0; row < height; row++) {
            for (int col = 0; col < width; col++) {
                Square square = new Square(row, col, lines[row].charAt(col));
                squares[row][col] = square;
                  if (square.val() == 'M')
                      count++;
            }
        }
 ...
 }`

Может ли это создание массива из Объекты делаются с использованием Java 8 Stream? Если так, как пожалуйста. Спасибо.

РЕДАКТИРОВАТЬ: второй вопрос

    for (int i = 0 ; i < 10; i ++) {
            for (int j = 0; j < 16; j++) {
                Square s = getSquare(i, j);
                if (s.getVal() == 'M')
                    return s;
            }
        }
     return null;
    }

1 Ответ

0 голосов
/ 07 апреля 2020

Используя java потоков, вы можете сделать что-то вроде этого:

        AtomicInteger row = new AtomicInteger(-1);
        // count specific characters with this:
        AtomicInteger someCount = new AtomicInteger();
        try (Stream<String> stringStream = Files.lines(Paths.get("yourFile.txt"))) { // read all lines from file into a stream of strings

            // This Function makes an array of Square objects of each line
            Function<String, Square[]> mapper = (s) -> {
                AtomicInteger col = new AtomicInteger();
                row.incrementAndGet();
                return s.chars()
                        .mapToObj(i -> {
                            // increment counter if the char fulfills condition
                            if((char)i == 'M')
                                someCount.incrementAndGet();
                            return new Square(row.get(), col.getAndIncrement(), (char)i);
                        })
                        .toArray(i -> new Square[s.length()]);
            };

            // Now streaming all lines using the mapper function from above you can collect them into a List<Square[]> and convert this List into an Array of Square objects
            Square[][] squares = stringStream
                    .map(mapper)
                    .collect(Collectors.toList()).toArray(new Square[0][]);
        }

Отвечая на ваш второй вопрос: Если у вас есть массив Square [] и вы хотите найти первый квадрат с val == ' M 'вы могли бы сделать это:

Optional<Square> optSquare = Stream.of(squares).flatMap(Stream::of).filter(s -> s.getVal() == 'M').findFirst();

// mySquare will be null if no Square was matching condition
Square mySquare = optSquare.orElse(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...