Да, этот код может быть упрощен.
Начиная с использования массива, это не лучший выбор для размещения ввода, поскольку вы не знаете его размера.Использование List
, которое можно расширить, чтобы соответствовать данным, будет проще.Далее, используя Stream
api, мы можем довольно легко преобразовать входные данные в List<List<Integer>>
.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
List<List<Integer>> matrix = reader.lines()
.takeWhile(line -> !line.equals("end"))
.map(line -> Arrays.stream(line.split(" "))
.map(Integer::valueOf)
.collect(Collectors.toList()))
.collect(Collectors.toList());
Теперь, когда у нас есть данные в нашем списке, мы вычислим размер ширины и высоты.
int height = matrix.size();
int width = matrix.get(0).size();
Вычисление местоположений (i-1, j), (i+1, j), (i, j-1), (i, j+1)
без IndexOutOfBoundsException
немного сложнее, однако вы можете использовать эту формулу по модулю.Пока offset
не будет отрицательно больше, чем size
, это будет работать.Вы также можете по модулю смещения, если это касается
(size + index + offset) % size
// or
(size + index + (offset % size)) % size
Чтобы добавить строки вместе с пробелом, вы можете использовать StringJoiner
.
for (int i = 0; i < height; i++) {
StringJoiner joiner = new StringJoiner(" ");
for (int j = 0; j < width; j++) {
int value = matrix.get((height + i - 1) % height).get(j)
+ matrix.get((height + i + 1) % height).get(j)
+ matrix.get(i).get((width + j - 1) % width)
+ matrix.get(i).get((width + j + 1) % width);
joiner.add(String.valueOf(value));
}
System.out.println(joiner.toString());
}