Java 在拆分的阵列上删除包含0的列

Java 在拆分的阵列上删除包含0的列,java,arrays,parsing,matrix,Java,Arrays,Parsing,Matrix,在一个函数中,我有两个50x50以上的2D数组作为输入,两个数组的列数相同,但行数不同。 基本上,我需要删除包含0到2的数字的公共列 例如: A: 3 0 0 0 0 1 0 5 0 0 6 0 0 2 2 0 0 7 1 0 0 B: 2 3 0 1 0 0 1 4 9 0 2 0 0 0 在这种情况下,我必须删除A和B中的第3、6和7列,因为第3列只有0,第6列只有0和1,最后一列的编号都是0到2 我可以使用像LinearAlgebra.deleteColumnsA,2

在一个函数中,我有两个50x50以上的2D数组作为输入,两个数组的列数相同,但行数不同。 基本上,我需要删除包含0到2的数字的公共列

例如:

A: 3 0 0 0 0 1 0
   5 0 0 6 0 0 2
   2 0 0 7 1 0 0

B: 2 3 0 1 0 0 1
   4 9 0 2 0 0 0
在这种情况下,我必须删除A和B中的第3、6和7列,因为第3列只有0,第6列只有0和1,最后一列的编号都是0到2

我可以使用像LinearAlgebra.deleteColumnsA,2,5,6这样的函数;直纹文胸,2,5,6;但由于我的输入数组很大,我必须对两个数组进行列解析比较

有什么办法吗?这里有一个使用3表示loopsjava的原始想法

for(int col=0; col < A[0].length; col++){   // step through each column
    int cnt = 0;

    for(int row = 0; row < B.length ; row ++){ 
        if(!(B[col][row].equals(0 | 1 | 2))) {
            cnt++;       
        }
    }

    if(cnt == 0) {
        // store number of column -> use later on LinearAlgebra.deleteColumns
    }

    for(int row = 0; row < A.length  ; row++){        
        if(!(A[col][row].equals(0 | 1 | 2)))
        cnt++;             
    }
    if(cnt == 0){
        // check aswell all values of B otherwise iterate next column
    }  
}
制作一个布尔标志,在列上循环,并决定删除哪些列

查找可删除列的示例:

boolean deleteFlag;
for ( int i = 0; i < columnAmount; i++ ) {
    deleteFlag = true;
    for (int j = 0; j < firstTableRowAmount; j++ ) {
        if (A[j][i] != 0) {
           deleteFlag = false;
           break;
        }
    }
    if(!deleteFlag) {
        continue;
    }
    for (int j = 0; j < secondTableRowAmount; j++ ) {
        if (B[j][i] != 0) {
           deleteFlag = false;
           break;
        }
    }
    if(deleteFlag) {
        callDeleteColumnFunction(i);
    }
}
callDeleteColumnFunctioni是一个函数,用于删除两个2D数组的第i列。

制作一个布尔标志,在列上循环,并决定要删除哪些列

boolean result[] = new boolean[<num of columns>];
for (int i = 0; i < result.length; ++i)
    result[i] = true;

for (int row = 0; row < arrayA.length; ++row) {
   for (int col = 0; col < arrayA[row].length; ++col)
       result[col] &= arrayA[row][col] == 0; 
}

for (int row = 0; row < arrayB.length; ++row) {
       for (int col = 0; col < arrayB[row].length; ++col)
       result[col] &= arrayB[row][col] == 0; 
}

for (int i = 0; i < 6; ++i) 
    System.out.println(result[i]);  
查找可删除列的示例:

boolean deleteFlag;
for ( int i = 0; i < columnAmount; i++ ) {
    deleteFlag = true;
    for (int j = 0; j < firstTableRowAmount; j++ ) {
        if (A[j][i] != 0) {
           deleteFlag = false;
           break;
        }
    }
    if(!deleteFlag) {
        continue;
    }
    for (int j = 0; j < secondTableRowAmount; j++ ) {
        if (B[j][i] != 0) {
           deleteFlag = false;
           break;
        }
    }
    if(deleteFlag) {
        callDeleteColumnFunction(i);
    }
}
callDeleteColumnFunctioni是删除两个2D数组的第i列的函数

boolean result[] = new boolean[<num of columns>];
for (int i = 0; i < result.length; ++i)
    result[i] = true;

for (int row = 0; row < arrayA.length; ++row) {
   for (int col = 0; col < arrayA[row].length; ++col)
       result[col] &= arrayA[row][col] == 0; 
}

for (int row = 0; row < arrayB.length; ++row) {
       for (int col = 0; col < arrayB[row].length; ++col)
       result[col] &= arrayB[row][col] == 0; 
}

for (int i = 0; i < 6; ++i) 
    System.out.println(result[i]);  
对于独占范围,只需删除=符号

并对第二个数组执行相同的操作

对于独占范围,只需删除=符号


对第二个数组执行同样的操作首先,您可能会混淆列和行顺序,因为您使用[0].length获得行计数,但在B[col][row]中使用它,但对于这一部分,我让您了解更多详细信息

无论如何,如果我理解你的问题,你正在寻找只包含0的列


为此,您应该首先将bool初始化为true,当值不同于0时,将其设置为false。对第二个bool使用相同的过程,最后比较两个bool,以确定是否必须删除该列

首先,您可能会混淆列和行顺序,因为您通过使用[0].length获得行计数,但您在B[col][row]中使用了它,但对于这一部分,我让您了解更多详细信息

无论如何,如果我理解你的问题,你正在寻找只包含0的列

为此,您应该首先将bool初始化为true,当值不同于0时,将其设置为false。对第二个bool使用相同的过程,最后比较两个bool,以确定是否必须删除该列

辅助功能:

private boolean isColumnDeletable(final int column, final int[][] array) {
    for (int row = 0; row < array.length; row++) {
        if (array[row][column] != 0)
            return false;
    }

    return true;
}
辅助功能:

private boolean isColumnDeletable(final int column, final int[][] array) {
    for (int row = 0; row < array.length; row++) {
        if (array[row][column] != 0)
            return false;
    }

    return true;
}

我认为您误解了问题或您的方式,因为您将A列和B列分别删除-而不是他/她想要的-并且您将值非0的列隐藏-您的中断只会中断jAh,是的,我知道,我相应地调整了代码,现在应该是正确的。我想你误解了这个问题或你的做法,因为你分别删除了A列和B列-而不是他/她想要的-并且你抑制了值不是0的列-你的中断只中断了jAh,是的,我明白了,我相应地调整了我的代码,现在应该是正确的。效果很好!最后一个小问题:如果我必须删除只包含0到2之间数字的列,我将如何更改您的代码?现在才意识到,实际上我必须删除在该范围内只包含数字的列。太棒了!最后一个小问题:如果我必须删除只包含0到2之间数字的列,我将如何更改您的代码?现在才意识到,实际上我必须删除只包含该范围内数字的列