简体   繁体   中英

Two dimensional array input from user in java from a sequence of lines, ending with a line input "end"

Here is my code. I think that there is much better way to fill matrix with integers from String lines. My output shows correct output, but it is too complicated. How to make it less complex?

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();
    }
  }
}

Here is the task assignment.

Write a program, which inputs the rectangular matrix from a sequence of lines, ending with a line, containing the only word "end" (without the quotation marks).

The program should output the matrix of the same size, where each elements in the position (i, j) is equal to the sum of the elements from the first matrix on the positions (i-1, j), (i+1, j), (i, j-1), (i, j+1). Boundary elements have neighbours on the opposite side of the matrix. In the case with one row or column, the element itself maybe its neighbour.

Sample Input:

9 5 3

0 7 -1

-5 2 9

end

Sample Output:

3 21 22

10 6 19

20 16 -1

Yes this code could be simplified.

Starting off, using array is not the best choice for containing the input because you don't know the input size. Using a List that can expand to fit the data will be easier. Further, using the Stream api, we can convert the input into a List<List<Integer>> fairly easily.

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());

Now that we have the data in our list we will compute the size of the width and height.

int height = matrix.size();
int width = matrix.get(0).size();

Computing the locations of (i-1, j), (i+1, j), (i, j-1), (i, j+1) without an IndexOutOfBoundsException is a little more tricky, however you can use this modulo formula. As long as the offset isn't negatively larger than the size this will work. You can also that the modulo of the offset if that is a concern

(size + index + offset) % size
// or
(size + index + (offset % size)) % size

To add the strings together with a space you can use a 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());
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM