【问题标题】:Remove Column with 0s on splitted Arrays删除拆分数组上的 0 列
【发布时间】:2014-04-03 12:01:31
【问题描述】:

在一个函数中,我有两个二维数组(超过 50x50)作为输入,它们都具有相同的 Nr。列但不同的编号。行。 基本上我需要删除包含 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

在这种情况下,我必须删除第 3 列、第 6 列和第 7 列(到 A 和 B),因为第 3 列只有 0,第 6 列只有 0 和 1,最后一列都是 Nr。从 0 到 2。

我可以使用像 LinearAlgebra.deleteColumns(A , 2 , 5,6);LinearAlgebra.deleteColumns(B, 2, 5,6); 这样的函数但由于我的输入数组很大,我必须对两个数组进行列解析。

有什么想法可以解决这个问题吗?这是使用 3 个 for 循环(java)的原始想法

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
    }  
}

【问题讨论】:

    标签: java arrays parsing matrix


    【解决方案1】:
    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]);  
    

    现在result 数组中的每个单元格(列)将指示哪一列包含两个数组的零。

    *注意:*这假设你说两个数组有相同的列数

    因评论而编辑:

    如果要删除其值在某个包含范围内的列,请使用此条件:

     result[col] &= arrayA[row][col] >= minRange && arrayA[row][col] <= maxRange;
    

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

    对第二个数组做同样的事情

    【讨论】:

    • 效果很好!最后一个小问题:如果我必须删除仅包含 0 到 2 之间数字的列,我将如何更改您的代码? (现在才意识到,我实际上不得不删除仅包含该范围内的数字的列)
    【解决方案2】:

    首先,您可能会混淆您的 col 和 row 顺序,因为您使用 A[0].length 获取行数,但您在 B[col][row] 中使用它,但对于这一部分,我让您查看更多详细信息。

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

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

    【讨论】:

      【解决方案3】:

      制作boolean 标志,遍历列并决定要删除哪些。

      查找可删除列的示例:

      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);
          }
      }
      

      callDeleteColumnFunction(i) 是一个删除两个二维数组的i-th 列的函数。

      【讨论】:

      • 我认为您误解了问题或您的方法,因为您分别删除了 A 列和 B 列 - 不是他/她想要的 - 并且您压制了具有除0 -- 你的 break 只会破坏 for j
      • 啊,是的,我明白了,我相应地调整了我的代码,现在应该是正确的。
      【解决方案4】:

      辅助函数:

      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;
      }
      

      示例用法:

      int[][] values1 = new int[][] {{1, 1, 1, 0, 1}, {2, 2, 2, 0, 2}, {3, 3, 3, 0, 3}};
      int[][] values2 = new int[][] {{4, 4, 4, 0, 4}, {5, 5, 5, 0, 5}};
      
      
      for (int column = 0; column < values1[0].length; column++) {
          System.out.printf("Checking column %d: ", column + 1);
      
          if (isColumnDeletable(column, values1) && isColumnDeletable(column, values2))
              System.out.printf("Deletable!\n");
          else
              System.out.printf("Not deletable!\n");
      }
      

      输出:

      Checking column 1: Not deletable!
      Checking column 2: Not deletable!
      Checking column 3: Not deletable!
      Checking column 4: Deletable!
      Checking column 5: Not deletable!
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多