Как удалить строку в двухмерной антенной решетке

Обратите внимание, что существует дополнительное, недокументированное ограничение к INSERT INTO... Оператор EXEC: это не может быть вложено. Таким образом, сохраненный proc, который называет ДОЛЖНОСТНОЕ ЛИЦО (или любой, что он звонит в свою очередь) не может самостоятельно сделать INSERT INTO... ДОЛЖНОСТНОЕ ЛИЦО. Кажется, что существует единственная временная память для каждого процесса, которая накапливает результат, и если они будут вложены, то Вы получите ошибку, когда вызывающая сторона откроет это, и затем вызываемый пытается открыть его снова.

Matthieu, необходимо было бы поддержать отдельные временные таблицы для каждого "типа" результата. Кроме того, при казни того же многократно Вы, возможно, должны были бы добавить дополнительный столбец к тому результату указать, из какого вызова он следовал.

5
задан AlexT 2 December 2009 в 19:38
поделиться

6 ответов

Вот пример класса, который, как мне кажется, выполняет то, что вы ищете. Удаление строк из 2D-массивов - непростое дело, потому что, как сказал @KalebBrasee, вы не можете действительно «удалить» их, а вместо этого вам нужно создать полностью новый 2D-массив. Надеюсь, это поможет!

import java.util.ArrayList;
import java.util.List;


public class Matrix
{
    private double[][] data;

    public Matrix(double[][] data)
    {
        int r= data.length;
        int c= data[0].length;
        this.data= new double[r][c];
        for(int i = 0; i < r; i++) {
            for(int j = 0; j < c; j++) {
                    this.data[i][j] = data[i][j];
            }
        }
    }

    /* convenience method for getting a 
       string representation of matrix */
    public String toString()
    {
        StringBuilder sb = new StringBuilder(1024);
        for(double[] row : this.data)
        {
            for(double val : row)
            {
                sb.append(val);
                sb.append(" ");
            }
            sb.append("\n");
        }

        return(sb.toString());
    }

    public void removeRowsWithValue(final double value)
    {
            /* Use an array list to track of the rows we're going to want to 
               keep...arraylist makes it easy to grow dynamically so we don't 
               need to know up front how many rows we're keeping */
        List<double[]> rowsToKeep = new ArrayList<double[]>(this.data.length);
        for(double[] row : this.data)
        {
            /* If you download Apache Commons, it has built-in array search
                      methods so you don't have to write your own */
            boolean found = false;
            for(double testValue : row)
            {
                            /* Using == to compares doubles is generally a bad idea 
                               since they can be represented slightly off their actual
                               value in memory */
                if(Double.compare(value,testValue) == 0)
                {
                    found = true;
                    break;
                }
            }

                    /* if we didn't find our value in the current row, 
                      that must mean its a row we keep */
            if(!found)
            {
                rowsToKeep.add(row);
            }
        }

            /* now that we know what rows we want to keep, make our 
               new 2D array with only those rows */
        this.data = new double[rowsToKeep.size()][];
        for(int i=0; i < rowsToKeep.size(); i++)
        {
            this.data[i] = rowsToKeep.get(i);
        }
    }

    public static void main(String[] args)
    {
        double[][] test = { {1, 2, 3, 4, 5, 6, 7, 8, 9},
                            {6, 2, 7, 2, 9, 6, 8, 10, 5},
                            {2, 6, 4, 7, 8, 4, 3, 2, 5},
                            {9, 8, 7, 5, 9, 7, 4, 1, 10},
                            {5, 3, 6, 8, 2, 7, 3, 7, 2} };

            //make the original array and print it out          
        Matrix m = new Matrix(test);
        System.out.println(m);

            //remove rows with the value "10" and then reprint the array
        m.removeRowsWithValue(10);
        System.out.println(m);
    }
}
8
ответ дан 18 December 2019 в 11:57
поделиться

Вы не можете удалять элементы из структуры данных встроенного массива Java. Вам нужно будет создать новый массив, длина которого на единицу меньше, чем у первого массива, и скопировать все массивы в этот массив, ЗА ИСКЛЮЧЕНИЕМ того, который вы хотите удалить.

1
ответ дан 18 December 2019 в 11:57
поделиться

Использовать System.arraycopy или используйте java.util.List вместо массивов. ArrayList имеет быстрый доступ к случайным элементам и медленный метод remove , в отличие от LinkedList . Вы должны выбирать сами.

5
ответ дан 18 December 2019 в 11:57
поделиться

В и вам нужно воссоздать массив и отбросить старый. Изменение размера существующего массива невозможно - если вам нужен этот тип структуры данных, вы должны построить матрицу на основе коллекций ( ArrayList > ), там вы можете легко удалить строку .

Вернемся к массивам - идея состоит в том, чтобы собрать все строки (массивы double []), которые вы хотите сохранить, создать массив результатов с этими строками и заменить старый на новый в Matrix:

public void doSomethingWith(Matrix in) {
  List<double[]> survivingRows = new ArrayList<double[]>();
  for (double[] row:in.getRows()) {
    if (isAGoodOne(row)) {
      survivingRows.add(row);
    }
  }

  double[][] result = new double[survivingRows][];
  for (int i = 0; i < result.length; i++) {
    result[i] = survivingRows.get(i);
  }
  in.setArray(result);
}
1
ответ дан 18 December 2019 в 11:57
поделиться

Мое мнение:

import java.util.Arrays;

public class RemoveArrayRow {
    private static <T> T[] concat(T[] a, T[] b) {
        final int alen = a.length;
        final int blen = b.length;

        if (alen == 0) {
            return b;
        }

        if (blen == 0) {
            return a;
        }

        final T[] result = (T[]) java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), alen + blen);

        System.arraycopy(a, 0, result, 0, alen);
        System.arraycopy(b, 0, result, alen, blen);

        return result;
    }

    public static void main(String[] args) {
        double[][] d  = { {11, 2, 3, 4, 5, 6, 7, 8, 9, 0},
                          {12, 2, 3, 4, 5, 6, 7, 8, 9, 1},
                          {13, 2, 3, 4, 5, 6, 7, 8, 9, 2},
                          {14, 2, 3, 4, 5, 6, 7, 8, 9, 3},
                          {15, 2, 3, 4, 5, 6, 7, 8, 9, 4} };

        //remove the fourth row:

        // (1)
        double[][] d1 = concat(Arrays.copyOf(d, 3), Arrays.copyOfRange(d, 4, 5));

        // (2)
        double[][] d2 = new double[d.length - 1][d[0].length];
        System.arraycopy(d, 0, d2, 0, 3);
        System.arraycopy(d, 4, d2, 3, 1);

        System.out.print(d1.length);
        System.out.print(d2.length);
    }
}

(1)
Если исключить функцию concat () , используемую для объединения двух массивов, она будет выполнена в одной строке:
double [] [] d1 = concat (Arrays.copyOf (d, 3), Arrays.copyOfRange (d, 4, 5));
См. также этот вопрос . Отсюда код для функции concat () .

(2)
Этот метод быстрее и использует только уже доступные функции.

0
ответ дан 18 December 2019 в 11:57
поделиться

Мой синтаксис java немного ржавый, но следующий код, если он рассматривается как псевдокод, будет работать

public Matrix removeRows(Matrix input) {
    int[][] output = new int[input.numRows][input.numColumns]();
    int i = 0;
    for (int[] row : input.rows()) {      // Matrix.rows() is a method that returns an array of all the rows in the matrix
        if (!row.contains(10)) {
            output[i] = row;
        }
    }
    return output
0
ответ дан 18 December 2019 в 11:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: