Двумерный массив ввода от пользователя в Java из последовательности строк, оканчивающихся на строку ввода "конец" - PullRequest
0 голосов
/ 05 декабря 2018

Вот мой код.Я думаю, что есть гораздо лучший способ заполнить матрицу целыми числами из строковых строк.Мой вывод показывает правильный вывод, но он слишком сложный.Как сделать его менее сложным?

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int [][]matrix = new int [7777][7777];
    int counter = 0;
    int counter1 = 0;
    for (int i = 0; i < 7777; i++) {
      String s = scanner.nextLine();
      if (!"end".equals(s)) {
        counter++;
        String s1[] = s.split(" ");
        for (int j = 0; j < s1.length; j++) {
          matrix[i][j] = Integer.parseInt(s1[j]);
          counter1++;
        }
      } else {
        break;
      }
    }
    int v = counter;
    int h = counter1/counter;

    for (int i = 0; i < v; i++) {
      for (int j = 0; j < h; j++) {
        if (v == 1 || h == 1) {
          System.out.print(matrix[i][j]*4 + " ");
        } else if (i == 0){
          if (j == 0){
            System.out.print(matrix[v-1][j] + matrix[i+1][j] + matrix[i][h-1] + matrix[i][j+1] + " ");
          } else if (j != h-1){
            System.out.print(matrix[v-1][j] + matrix[i+1][j] + matrix[i][j-1] + matrix[i][j+1] + " ");
          } else {
            System.out.print(matrix[v-1][j] + matrix[i+1][j] + matrix[i][j-1] + matrix[i][0] + " ");
          }
        } else if (j == 0 && i != v-1){
          System.out.print(matrix[i-1][j] + matrix[i+1][j] + matrix[i][h-1] + matrix[i][j+1] + " ");
        } else if (j != 0 && j != h-1 && i != v-1) {
          System.out.print(matrix[i-1][j] + matrix[i+1][j] + matrix[i][j-1] + matrix[i][j+1] + " ");
        } else if (j == h-1 && i != v-1){
          System.out.print(matrix[i-1][j] + matrix[i+1][j] + matrix[i][j-1] + matrix[i][0] + " ");
        } else if (i == v-1) {
          if (j == 0) {
            System.out.print(matrix[i-1][j] + matrix[0][j] + matrix[i][h-1] + matrix[i][j+1] + " ");
          } else if (j != h-1) {
            System.out.print(matrix[i-1][j] + matrix[0][j] + matrix[i][j-1] + matrix[i][j+1] + " ");
          } else {
            System.out.print(matrix[i-1][j] + matrix[0][j] + matrix[i][j-1] + matrix[i][0] + " ");
          }
        }
      }
      System.out.println();
    }
  }
}

Вот назначение задачи.

Напишите программу, которая вводит прямоугольную матрицу из последовательности строк, заканчиваясо строкой, содержащей единственное слово «конец» (без кавычек).

Программа должна вывести матрицу одинакового размера, где каждый элемент в позиции (i, j) равенсумма элементов из первой матрицы по позициям (i-1, j), (i + 1, j), (i, j-1), (i, j + 1).Граничные элементы имеют соседей на противоположной стороне матрицы.В случае с одной строкой или столбцом сам элемент может быть его соседом.

Пример ввода:

9 5 3

0 7 -1

-5 2 9

end

Пример вывода:

3 21 22 * ​​1028 *

10 6 19

20 16 -1

1 Ответ

0 голосов
/ 05 декабря 2018

Да, этот код может быть упрощен.

Начиная с использования массива, это не лучший выбор для размещения ввода, поскольку вы не знаете его размера.Использование 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...