当前位置: 首页 > 知识库问答 >
问题:

在java中,如何让用户在不规则数组中输入列数,但每行的列数应该不同

晋言
2023-03-14

在java中,我想创建并打印一个参差不齐的数组,用户首先必须输入行数,然后在每行中,用户必须输入数字列,然后在每列中输入他想要的数字,直到达到他为每行输入的数字,例如

4 11 22 33 44
2 51 8
6 92 1 3 5 3 99

在第一行中,用户输入4,以便键入四个数字

在第二行中,用户输入2,以便键入两个数字

在第三行,用户输入6,这样他可以键入四个数字

之后,它应该打印用户为每行输入的数字以及他输入的任何内容(它应该打印上面的示例)

但出于某种原因使用我的代码

int rows , col, m=0 , z=0 ;

System.out.println("enter number of rows");
rows=input.nextInt();
        
while(z<rows){
System.out.println("in each row enter number of coloms and then enter whatever number you want in there");
col=input.nextInt();
z++;
for(int i =0 ; i<col ; i++) {
m=input.nextInt();}
}
            
int [][] test1 = new int [rows][m];

for(int i =0 ; i<test1.length ; i++) {
for( int j =0 ; j<test1[i].length ; j++)
System.out.print(test1[i][j]+ " ");
System.out.println();}      


所有输出都是零,但用户输入的第一件事的行数是正确的,所以我没有问题

因此,与其有这样的输出

enter number of rows
3
in each row enter number of coloms and then enter whatever number you want in there
4 11 22 33 44 // for example the user will enter these numbers and it will be printed the way he typed it
2 51 8
6 92 1 3 5 3 99

但我得到了这个输出

enter number of rows
3
4 11 22 33 44  // if the user have entered these numbers it will print all of the array zeros depending on the first number in the last row 
2 51 8
6 92 1 3 5 3 99

//  this is what I get
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 

我一整天都在寻找解决方案,但什么也没找到,有人知道如何解决这个问题吗?

很抱歉让你读了这么多

共有1个答案

潘泳
2023-03-14

使用ArrayList而不是int“array”求解:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("How many rows?");
    int rowsSize = input.nextInt();
    List<List<Integer>> rows = new ArrayList<>();
    for (int i = 0; i < rowsSize; i++) {
        System.out.println("How many columns?");
        int colSize = input.nextInt();
        List<Integer> cols = new ArrayList<>();
        for (int j = 0; j < colSize; j++) {
            System.out.println("Write a number");
            cols.add(input.nextInt());
        }
        rows.add(cols);
    }
    for (List<Integer> row : rows) {
        for (Integer number : row) {
            System.out.print(number);
        }
        System.out.println("");
    }
}

正如Alex提到的,数组不适合这种动态重新调整大小。大多数情况下,应首选ArrayList而不是array,除非内存/速度非常关键。

编辑:使用2d数组为您的问题编写了一个解决方案,但我的建议是更喜欢List:public class StackOverflowQuestion{

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("How many classes?");
    int numberOfClasses = input.nextInt();
    int largestNumberOfMarksInAClass = numberOfClasses;
    int[][] classesAndMarks = new int[numberOfClasses][largestNumberOfMarksInAClass];
    for (int i = 0; i < numberOfClasses; i++) {
        System.out.println("How many marks in class  " + (i + 1) + "?");
        int numberOfMarks = input.nextInt();
        if (numberOfMarks > largestNumberOfMarksInAClass) { //If the new class has an higher number of marks,
            largestNumberOfMarksInAClass = numberOfMarks;   //we have to increase the size of the 2d array
            classesAndMarks = getResizedArray(numberOfClasses, largestNumberOfMarksInAClass, classesAndMarks);
        }
        for (int j = 0; j < numberOfMarks; j++) {
            System.out.println("Please write a mark");
            classesAndMarks[i][j] = input.nextInt();
        }
    }

    int highestAverageIndex = 0;
    double[] averageMarks = averageAllClassesMarks(classesAndMarks);
    System.out.println("Class average");
    for (int i = 0; i < averageMarks.length; i++) {
        System.out.println((i + 1) + " " + averageMarks[i]);
        if (averageMarks[i] > averageMarks[highestAverageIndex]) {
            highestAverageIndex = i;
        }
    }
    System.out.println("The highest average is " + averageMarks[highestAverageIndex] +
            " and it is for class " + (highestAverageIndex + 1));
}

private static int[][] getResizedArray(int numberOfClasses, int largestNumberOfMarksInAClass, int[][] classesAndMarks) {
    int[][] resizedArray = new int[numberOfClasses][largestNumberOfMarksInAClass];
    for (int i = 0; i < classesAndMarks.length; i++) {
        int[] mark = classesAndMarks[i];
        for (int j = 0; j < mark.length; j++) {
            resizedArray[i][j] = mark[j];
        }
    }
    return resizedArray;
}

private static double[] averageAllClassesMarks(int[][] classesAndMarks) {
    double[] averageAllClasses = new double[classesAndMarks.length];
    for (int i = 0; i < classesAndMarks.length; i++) {
        averageAllClasses[i] = averageClassMarks(classesAndMarks[i]);
    }
    return averageAllClasses;
}

private static double averageClassMarks(int[] marks) {
    double sum = 0;
    double numberOfMarks = 0;
    for (int mark : marks) {
        sum += mark;
        if (mark != 0) {
            numberOfMarks++;
        }

    }
    return Math.round((sum / numberOfMarks) * 100.0) / 100.0;
}

}

 类似资料:
  • 所以我们刚刚进行了一个小的实践考试,要求我们阅读以下格式的输入,作为非图形问题的规则。实际的算法一点也不难做到,但我和我的伙伴们都不知道如何从一开始就扫描这些输入。 前两个整数表示行数(4)和列数。(4) 因此,接下来的四行表示每行的规则(1 2 3表示第2行),接下来的四行表示每列的规则(2 2表示第4列),依此类推。 在学习C语言一个学期后,我们只处理了每行具有相同列数的数组,在这个Java模

  • 我有两个ArrayLists:一个字符串列表和一个整数列表。例如: 我正在尝试对整数ArrayList进行排序(使用MergeSort)并使字符串ArrayList与整数ArrayList相对应,例如: 我得到的其他答案建议使用映射(int是键,String是值);但是,我不能这样做,因为会有重复的密钥。 我读过关于番石榴的多地图;但是,我不太喜欢将jar文件包含到类路径中。 有没有其他办法可以做

  • 通过前面的学习我们知道 Java 实际上没有多维数组,只有一维数组。多维数组被解释为是数组的数组,所以因此会衍生出一种不规则数组。 规则的 4×3 二维数组有 12 个元素,而不规则数组就不一定了。如下代码静态初始化了一个不规则数组。 int intArray[][] = {{1,2}, {11}, {21,22,23}, {31,32,33}}; 高维数组(二维以及二维以上的数组称为高维数组)是

  • 问题内容: 所以我有这个示例数据框: 现在我想将这些功能和列获得新列。 就像函数使用列和范围作为创建列的输入一样,类似地,列和范围也用于列: 我可以使用这一种衬管一个接一个地创建每个列,但是我想一次用一个衬管将其应用于两个列。 结果数据帧应如下所示: 我想一次创建这些列,而不是一次创建一列。我怎样才能做到这一点?有什么建议?或类似的东西可以工作? 问题答案: 这是您需要遵循的概念才能实现这一目标。

  • 问题内容: 对于Java中的数组,我们可以使用获取数组的。同样,如何获得 2D 数组的行数和列数? 问题答案: 好吧,您可能想要获取行数和列数。也就是说,如果您这样定义数组:

  • 对于名为cb_节点的数组,我有不同数量的列。要对这些数据进行后处理,需要准确知道每行中的列数。 数组如下所示。 等等...数组中的每一行都有不同数量的列数。只是个例子,数组中的键是不同的。 TCL中的命令集只有和,它没有给出每行的行号和列号。 在TCL,我们如何做到这一点?