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

从一个二维阵列添加元素到另一个二维阵列Java

云季萌
2023-03-14

我试图将一个2d数组中的特定元素添加到另一个数组中,添加的过程是在数组的第一行选择最小的元素,并将该元素添加到同一位置的另一个2d数组中,例如:

2 22 3

5 1 54

7 3 10

20 22 21

这里,第一行中的最小元素是2,所以应该在相同的位置将2添加到另一个2d数组中,对于第二行,1是最小元素,所以我们也将1添加到另一个2d数组中,第三行中的最小元素是3,最后一行,第四行,最小的元素是20,但我们不能选择20作为最小元素,因为我们检查了第二个2d数组中的列之和,这个数组是用0初始化的,所以这里如果我们选择20,那么它的列之和是21,因为我们选择了21,如果我们选择了22,那么我们选择了22,那么我们选择了22,那么我们选择了21,那么我们选择了21,这里21是最小的,因为它的列之和是最小的:

1 0 0

0 1 0

0 3 0

0 0 21

如果有其他行和列,这个过程会继续进行。

这就是我到目前为止所做的:

import java.util.Arrays;
public class Main
{
//Method which finds the sum of columns
public static int[] sumOfCol(int[][] tempArr){
    int size = tempArr[0].length; // Replace it with the size of maximum length inner 
array
    int temp[] = new int[size];

    for (int i = 0; i < tempArr.length; i++){
        for (int j = 0; j < tempArr[i].length; j++){
            temp[j] += tempArr[i][j];
        }
    }
    System.out.println(Arrays.toString(temp));
    return temp;
}
//The algorithm
public static void algorithm(int[][] tempArr,int[][] tempArr2){
    for (int i = 0; i < tempArr.length; i++) {
        int minimum = tempArr[i][0];
        for (int j = 0; j < tempArr[0].length; j++) {
            if (tempArr[i][j] < minimum) {
                minimum = tempArr[i][j];
                tempArr2[i][j] = minimum;
            }
        }
    }
}
//To generate teh Array
public static void generateArray(int[][] arr){
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 3; j++) {
            arr[i][j] = (int) ((Math.random() * (25 - 1)) + 1);
        }
    }
}
//To print an array
public static void printArray(int[][] arr){
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[0].length; j++) {
            System.out.print(arr[i][j] + " ");
        }
        System.out.println();
    }
}
public static void main(String[] args) {
    int [][] tempArr = new int [5][3];
    int[][] tempArr2 = new int[tempArr.length][tempArr[0].length];
    //Initilise second array with 0's
    for (int i = 0; i < tempArr2.length; i++) {
        for (int j = 0; j < tempArr2[0].length; j++) {
            tempArr2[i][j] = 0;
        }
    }
    generateArray(tempArr);
    System.out.println("Array before executing the algorithm : ");
    printArray(tempArr);
    algorithm(tempArr,tempArr2);
    System.out.println("Array after executing the algorithm : ");
    printArray(tempArr2);
}
}

共有1个答案

谢铭
2023-03-14

我无法找到你的代码中的错误,但找到了另一种方法来做你正在寻找的:

    //The algorithm
    public static int[][] algorithm(int[][] tempArr){
        // create the empty array.
        int[][] modifiedArr = new int[tempArr.length][tempArr[0].length];
        for (int i = 0; i < modifiedArr.length; i++) {
            for (int j = 0; j < modifiedArr[0].length; j++) {
                modifiedArr[i][j] = 0;
            }
        }
        // loop through all rows and change one value in each row on modifiedArr in a way that leads to the column sum being miniumum.
        for (int i = 0; i < tempArr.length; i++) {
            setMinimumColumn(tempArr,modifiedArr,i);
        }
        return modifiedArr;
    }

    static void setMinimumColumn(int[][] originalArr, int[][] modifiedArr, int row){
        int minColumn = 0;
        int minColumnSum = Integer.MAX_VALUE;
        for (int i=0; i <originalArr[row].length ;i++){
            modifiedArr[row][i] = originalArr[row][i];
            int columnSum = getColumnSum(modifiedArr,i);
            if (columnSum < minColumnSum) {
                minColumn = i;
                minColumnSum = columnSum;
            }
            modifiedArr[row][i] = 0;
        }
        modifiedArr[row][minColumn] = originalArr[row][minColumn];
    }

    static int getColumnSum(int[][] arr, int column){
        int sum = 0;
        for (int i = 0; i<arr.length; i++){
            for (int j = 0; j<arr[0].length; j++) {
                if (j == column){
                    sum+=arr[i][j];
                }
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        int [][] tempArr = new int [5][3];
        generateArray(tempArr);
        
        System.out.println("Array before executing the algorithm : ");
        printArray(tempArr);

        System.out.println("Array after executing the algorithm : ");
        printArray(algorithm(tempArr));
    }

基本上,您从循环遍历行开始。每一行都被赋予set最低列方法,该方法循环遍历该行中的所有元素,并尝试以最小化列和的方式将它们放入修改的Arr中。对所有列这样做会给你答案。

 类似资料:
  • 我是编程新手,我有一个任务要求从一维数组创建二维数组。我想到了这一点(没有任何外部来源的帮助,因为这会剥夺学习经验)。它适用于我们教授的测试输入,我只是想知道这是一个丑陋/低效的解决方案。 测试输入:twoDArray([1,2,3,4,5],3)输出将是:[[1,2,3],[4,5]]

  • 为什么上面的代码不起作用,我应该如何纠正?

  • 试图实施更大规模的井字游戏 这个游戏可以有超过3行和3列 每当发现4个连续的模式(水平,垂直或交叉) 选手是赢家 我已经找到了水平和垂直匹配的实现方法 但是找不到一种方法来识别2d数组中某个字符的交叉模式 考虑下面的二维数组 ` ` 如何检查“*”字符在这个2d数组中是否有四个连续的交叉模式

  • 我试着做一个Loto游戏,我必须生成一张随机的卡,在第一个collum数字从1-9,第二个10-19一直到90。这张牌的另一个规则是,每行的随机位置上只能有5个数字,这就是我遇到的麻烦。 我从这个开始在每个collum中添加数字: 然后在数组的每一行的一个数字位置上放5个数字我试过这样做: 第三个也一样。 输出: 0 18 0 0 46 0 61 72 88 0 18 0 31 0 55 0 0

  • 这段代码测试了一个标准的3×3tic tac toe游戏中的胜利。我的问题是,我如何改变里面的数字来匹配任何大小的棋盘,比如n×n? 目前,它检查第一行、第二行和第三行,以检查任何一个玩家是否在任何一行中获胜,接下来是列和对角线。但是,当板的大小更改为其他大小时,这将不再成立,因为它不会检查每一个可能的行/列/对角线。那么,对于尺寸为n×n的板,我该如何做到这一点。请不要代码,因为我不希望剽窃,但

  • 所以,我正在尝试匹配 2 个不同的数组。如果相同的单元格匹配,我想使用 .slice 方法从一个数组中删除该单元格。 编辑:我想做的是从数组1中移除一个数字,如果数组2包含一个匹配的数字。代码现在的工作方式是只删除1个条目。我要删除第一个数组中的所有条目。 我尝试运行这个,在控制台日志下,array1没有变化。似乎拼接方法没有删除任何单元格。我搜索了SE,但没有找到任何可以帮助我的东西。