这是我的代码。我认为有更好的方法用字符串行中的整数填充矩阵。我的输出显示正确的输出,但它太复杂了。如何让它变得不那么复杂?
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();
}
}
}
这是任务分配。
编写一个程序,输入一系列行的矩形矩阵,以一行结尾,包含唯一的单词“end”(不带引号)。
程序应输出相同大小的矩阵,其中位置 (i, j) 中的每个元素等于位置 (i-1, j) 上第一个矩阵的元素之和,(i +1,j),(i,j-1),(i,j+1)。边界元素的邻居位于矩阵的另一侧。在一行或一列的情况下,元素本身可能是它的邻居。
示例输入:
9 5 3
0 7 -1
-5 2 9
结束
示例输出:
3 21 22
10 6 19
20 16 -1
最佳答案
是的,这段代码可以简化。
首先,使用数组并不是包含输入的最佳选择,因为您不知道输入大小。使用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());
}
关于java - 用户在 java 中从一系列行输入的二维数组,以行输入 "end"结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638812/