使用Java Scanner创建一个具有不同大小列的2D阵列



是否可以使用Java scanner创建具有不同大小列的数组?类似=[[1,2][3,4,5,6][7,8,9]]我已经尝试过了,但当变量元素在它旁边的循环之外时,它不起作用,但当它在旁边的循环内部时,它似乎起作用了。这是代码:

import java.util.Scanner;
/**
*
* @author cismvillanueva
*/
public class FindInGroup {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StringBuilder output = new StringBuilder();
System.out.print("Enter number of groups: ");
int groups = scanner.nextInt(); //number of groups
System.out.print("Enter number of elements to be search: ");
int nSearch = scanner.nextInt();
int[] nElements = new int[groups];
for (int i = 0; i < groups; i++) {
System.out.print("Enter number of elements for each group: ");
nElements[i] = scanner.nextInt();
}
int[][] elements = new int[groups][nElements[i]];//here's the variable that gives error when outside the next loop
for (int i = 0; i < groups; i++) {
for (int j = 0; j < nElements[i]; j++) {
System.out.print("Enter number: ");
elements[i][j] = scanner.nextInt();
output.append("n").append(elements[i][j]);
}
System.out.println(" ");
}
}
}

正如您所知,内部数组的大小仅在循环中,也就是您可以创建它们的的地方

int[][] elements = new int[groups][];
for (int i = 0; i < groups; i++) {
System.out.format("Values of group %dn", i + 1);
elements[i] = new int[nElements[i]];

但你会看到你在值[0;groups[上迭代两次,你可以在一个循环中完成所有操作,而不是它改变了输入的顺序:在每个组大小的之后都会询问值

int[][] elements = new int[groups][];
for (int i = 0; i < groups; i++) {
System.out.printf("Enter number of elements for group %d: ", i + 1);
elements[i] = new int[scanner.nextInt()];
for (int j = 0; j < elements[i].length; j++) {
System.out.print("Enter value: ");
elements[i][j] = scanner.nextInt();
}
}
System.out.println(Arrays.deepToString(elements));
Enter number of groups: 3
Enter number of elements for group 1: 2
Enter value: 1
Enter value: 2
Enter number of elements for group 2: 4
Enter value: 3
Enter value: 4
Enter value: 5
Enter value: 6
Enter number of elements for group 3: 3
Enter value: 7
Enter value: 8
Enter value: 9
[[1, 2], [3, 4, 5, 6], [7, 8, 9]]

2D数组只是一个元素也是数组的数组——数组和任何其他对象一样是一个实例
例如,如果您有一个声明为int[][] elements的2D数组,则可以执行int[] innerArray = elements[i]

为了避免对原始代码进行太多更改,您必须首先创建外部数组,然后再进行最后一次循环:

int[][] elements = new int[groups][]

这将创建一个groups元素的数组,每个元素都能够保存一个int数组,但尚未初始化,即所有null

在外部循环中,必须在填充内部数组之前创建内部数组,也就是说,在内部循环之前:

elements[i] = new int[nElements[i]];

第二个循环(通过j(现在可以设置每个元素(elements[i][j](。


这可以优化,正如azro的回答中所给出的,不需要nElements-您可以直接创建内部数组,而无需将大小保存到额外的数组中。这有点快,但也更容易读取(IMO(,并且减少了一个可能的错误源。

最新更新