Удалить столбец с нулями на разделенных массивах

1

В функции я имею на входе два 2D-массива (более 50x50), оба с одинаковыми Nr. столбцов, но разных 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 имеет только 0s, столбец шесть - только 0 и 1, а последний столбец все Nr. от 0 до 2.

Я мог бы использовать такую функцию, как LinearAlgebra.deleteColumns(A, 2, 5,6); и LinearAlgebra.deleteColumns(B, 2, 5,6); но поскольку мой входной массив огромен, мне придется выполнять разбор столбцов, сравнивая оба массива.

Есть идеи, чтобы подойти к этому? Здесь исходная идея использования 3 для циклов (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
    }  
}
Теги:
arrays
matrix
parsing

4 ответа

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 укажет, какой столбец содержит нули для обоих массивов.

* Примечание: * Это предполагает, как вы сказали, что оба массива имеют одинаковое количество столбцов

EDIT из-за комментария:

Если вы хотите удалить столбцы, значения которых находятся в определенном инклюзивном диапазоне, используйте это условие:

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

для эксклюзивного диапазона просто удалите знак =

и сделать то же самое для второго массива

  • 0
    Работает отлично! Последний небольшой вопрос: как бы я изменил ваш код, если бы мне пришлось удалять столбцы, содержащие ТОЛЬКО цифры от 0 до 2? (Только сейчас понял, мне действительно пришлось удалить столбцы, которые содержали только числа в этом диапазоне)
  • 1
    Оно работает!! КУДОС (Y)
1

Сделайте 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 столбец обоих 2D-массивов.

  • 1
    Я думаю, что вы приняли вопрос или ваш способ сделать это, потому что, поскольку вы удаляете столбцы A и B отдельно - не то, что он / она хочет - и вы подавляете столбец, имеющий значение, отличное от 0 - ваш разрыв только нарушает for j
  • 0
    Ах, да, я вижу, я изменил свой код соответственно, должно быть сейчас правильно.
Показать ещё 1 комментарий
1

в первую очередь, вы, возможно, путаете свой порядок col и row, потому что вы получаете количество строк с помощью A[0].length но вы используете его в B[col][row] но для этой части я расскажу вам более подробно.

в любом случае, если я хорошо понимаю вашу проблему, вы ищете столбец, содержащий только 0.

Для этого вы должны сначала ввести bool в true, а когда значение, отличное от 0, вы положите на false. используя тот же процесс для второго с другим bool вы, наконец, сравниваете два bool, чтобы узнать, нужно ли удалять столбец;)

1

Вспомогательная функция:

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!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню