【问题标题】:Adding columns in an array that is created using command line arguments在使用命令行参数创建的数组中添加列
【发布时间】:2023-03-31 18:53:02
【问题描述】:

我对这个程序的目标是创建一个二维数组ratings,其大小由命令行的前两个参数指定。 args[0] 代表行数 rarg[1] 代表列数 c。接下来的参数都将用于填充数组。所以如果命令行参数是 3 2 5 2 3 3 4 1。我希望该数组是 3 行乘 2 列。值 5 将在 rating[0][0] 中,值 2 将在 rating[0][1] 中,值 3 将在 rating[1][0] 中,等等。在那之后,我想计算每列的总和。因此,在这种情况下,第 0 列将是 12,第 1 列将是 6。

public static void main(String[] args) {
    int r = Integer.parseInt(args[0]);
    int c = Integer.parseInt(args[1]);
    int[][] ratings = new int[r][c];
    int z = 2;
    int y = 3;
    int x = 0;
    int counting = 0;
    int sum = 0;
    for (int rows = 0; rows < ratings.length; rows++ ) {
        for (int column = 0; column < ratings[c].length; column++){
            ratings[rows][column] = Integer.parseInt(args[z]);
            sum += ratings[rows][column];
            z++;
        }
        System.out.println(sum);
        sum = 0;
    }
    //System.out.println(movieRating);
}

这是我对列求和的尝试,但现在这只是求和 5 和 2、3 和 3、4 和 1。我希望对列而不是行求和,但不知道如何解决它。谢谢

【问题讨论】:

  • 您的第一个 for 循环填充列,而不是行,因此第二行反之亦然。这也许是混乱的根源。这样对吗?如果是这样,那么我将进行另一个数组遍历并总结该遍历中的列。但我不确定这是否是正确的做法。
  • 您需要一个列总和数组,或者您需要在构建数组后在单独的步骤中进行求和。
  • 我想要对列而不是行求和,但不知道如何解决我不明白你的意思。总结所有行或总结所有列是一样的
  • @Eklavya OP 想要每一列的总和。注意外部 for 循环中的 sum = 0; 指令。
  • @Patrick 你的意思是每行每一列的总和吗?你怎么能从sum = 0; 假设?

标签: java arrays multidimensional-array command-line


【解决方案1】:

您似乎正确地将值添加到二维数组。你缺少的是一个额外的嵌套循环来打印列总数:

for (int i = 0; i < ratings[c].length; i++) {
   int colSum = 0;
   for (int j = 0; j < ratings.length; j++) {
      colSum += ratings[j][i];
   }
   System.out.println(colSum);
}

在您当前拥有//System.out.println(movieRating); 行的位置添加。由于您是按行将数字添加到数组中,因此您需要翻转 for 循环才能对列求和。

【讨论】:

  • 嘿!非常感谢你提供的信息。我希望你能帮助我解决最后一个问题。我已经从这个线程拼凑了一堆解决方案,现在我的代码看起来像pastebin.com/QncDa8NH - 效果很好!我只想做一个改变,就是我希望程序的最终结果显示总和最高的列,如果没有最高总和则显示最低总和。这在 for 循环中是否可行?我已经尝试过使用它无济于事。我不知道如何将总和存储为变量 %比较
  • @zambonideen 我要做的是用HashMap&lt;Integer, Integer&gt; sumMap = new HashMap&lt;&gt;(); 声明一个新的HashMap。然后,当您在 for 循环中计算每个列的总和时,使用 sumMap.put(columnIndex, columnSum) 将每个总和放入 sumMap,并以列索引作为键。然后,一旦它们都被计算出来,循环遍历 HashMap 并找到对应于最大值的键(列索引)。这里有一个例子:stackoverflow.com/questions/5911174/…
【解决方案2】:

你做对的事情

您使用命令行中给出的值正确初始化了ratings 2D 数组。让我在下面重新编写此内容,而无需您尝试计算列的总和。请注意,我重命名了变量,以便 for 循环中使用的索引是单字母变量。

public static void main(String[] args) {
    int rows = Integer.parseInt(args[0]);
    int columns = Integer.parseInt(args[1]);
    int[][] ratings = new int[rows][columns];
    int argIndex = 2;
    
    for (int r = 0; r < ratings.length; r++ ) {
        for (int c = 0; column < ratings[r].length; c++){
            ratings[r][c] = Integer.parseInt(args[argIndex]);
            argIndex++;
        }
    }
}

你没有做对的事情

ratings 数组逐行填充。在您发布的代码中,您在变量sum 中计算插入同一行的元素的总和。这就是它没有打印出您期望的结果的原因。

要计算每列的总和,我建议您创建一个新数组来存储此结果。将其与上面的代码集成:

public static void main(String[] args) {
    int rows = Integer.parseInt(args[0]);
    int columns = Integer.parseInt(args[1]);
    int[][] ratings = new int[rows][columns];
    int[] columnSums = new int[columns];
    int argIndex = 2;
    
    for (int r = 0; r < ratings.length; r++ ) {
        for (int c = 0; column < ratings[r].length; c++){
            ratings[r][c] = Integer.parseInt(args[argIndex]);
            columnSums[c] += ratings[r][c];
            argIndex++;
        }
    }

    // array columnSums contains your results
}

【讨论】:

  • 嘿帕特里克,我非常感谢您的回复和详细的说明。然而,不知何故,我比以前更困惑了。我尝试复制您发送的代码,这意味着一堆错误。我认为移动了太多变量名,现在我无法跟踪正在发生的事情。您介意用 cmets 或更清晰的变量名重新发布代码吗?我试图让它运行,但也无法运行。
  • 是的,我也注意到了。我想我刚刚修好了。你能再试一次吗?我忘记在某些地方重命名z
  • 嘿!非常感谢你提供的信息。我希望你能帮助我解决最后一个问题。我已经从这个线程拼凑了一堆解决方案,现在我的代码看起来像pastebin.com/QncDa8NH - 效果很好!我只想做一个改变,就是我希望程序的最终结果显示总和最高的列,如果没有最高总和则显示最低总和。这在 for 循环中是否可行?我已经尝试过使用它无济于事。我不知道如何将总和存储为变量 %比较
  • 可以从columnSums 数组中确定总和最高的列。然而,这超出了这个问题的范围。尝试寻找“在数组中查找最大值”。我相信你会找到很多解决方案。 Here is a question with an answer which you can adapt to your problem。如果您仍有问题,最好提出一个新问题。
【解决方案3】:

我已将您的原始代码更改为更简单的版本。 如果您在理解解决方案时遇到问题,请告诉我。

public static void main(String[] args)
{
    int row = Integer.parseInt(args[0]);
    int col = Integer.parseInt(args[1]);
    
    int arrayLength = row * col;            // use a single dimension array, for simplicity
    int[] ratings = new int[arrayLength];   // the array size is based on the rows and columns
    
    // add data to the 'ratings' array
    // This is not actually needed because the conversion can be done directly when the columns are summed up
    for(int i = 0; i < arrayLength; i++)
    {
        ratings[i] = Integer.parseInt(args[i + 2]);
    }
    
    // sum up the columns using the % operator
    int[] result = new int[col];
    for(int i = 0; i < arrayLength; i++)
    {
        result[i % col] += ratings[i];
    }
    
    // print result
    for(int i = 0; i < result.length; i++)
    {
        System.out.println(String.format("Movie %d rating is %d", i, result[i]));
    }
}

PS:您缺少围绕 String 到 int 转换的验证并检查用户输入的正确性

【讨论】:

  • 嘿!非常感谢你提供的信息。我希望你能帮助我解决最后一个问题。我已经从这个线程拼凑了一堆解决方案,现在我的代码看起来像pastebin.com/QncDa8NH - 效果很好!我只想做一个改变,就是我希望程序的最终结果显示总和最高的列,如果没有最高总和则显示最低总和。这在 for 循环中是否可行?我已经尝试过使用它无济于事。我不知道如何将总和存储为变量 %比较
  • 我不太明白你所说的最高和最低总和是什么意思,但如果你需要这样做,那真的很容易。您只需要再次浏览结果数组并找到最高值和最低值。在将值相加到结果数组中时,您不能这样做,因为您只能得到部分“高点”和部分“低点”。这是一个如何做到这一点的示例:beginnersbook.com/2014/07/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2015-11-29
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多