Question

J'ai un tableau simple, un peu comme ça

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

Alors, appelons cela matrix[5][9]. Je souhaite maintenant supprimer chaque ligne de cette matrice qui contient une certaine valeur, dans ce cas 10, il me reste donc ...

1 2 3 4 5 6 7 8 9
2 6 4 7 8 4 3 2 5
5 3 6 8 2 7 3 7 2
Était-ce utile?

La solution

Voici un exemple de classe que vous pouvez exécuter et qui, à mon avis, fait ce que vous recherchez. Supprimer des lignes de tableaux 2D est une tâche délicate, car, comme @KalebBrasee, vous ne pouvez pas vraiment & "; Supprimer &"; mais vous devez plutôt créer un nouveau tableau 2D. J'espère que cela aide!

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

Autres conseils

Utilisez System.arraycopy ou utilisez java.util.List au lieu des tableaux. ArrayList a un accès rapide à des éléments aléatoires et une méthode remove lente, c'est l'inverse de LinkedList. Vous devez choisir vous-même.

Vous ne pouvez pas supprimer d'éléments de la structure de données de tableau intégrée à Java. Vous devrez créer un nouveau tableau dont la longueur est inférieure à celle du premier tableau, puis copier tous les tableaux dans ce tableau SAUF celui que vous souhaitez supprimer.

Sur le et vous devez recréer le tableau et rejeter l’ancien. Il n'est pas possible de modifier la dimension d'un tableau existant. Si vous souhaitez utiliser ce type de structure de données, vous devez créer la matrice à partir de Collections (ArrayList<ArrayList<Double>>). Vous pouvez ainsi supprimer facilement une ligne.

Retour aux tableaux: l’idée est de collecter toutes les lignes (doubles []) que vous souhaitez conserver, de créer un tableau de résultats avec ces lignes et de remplacer l’ancien par le nouveau sur 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);
}

Ma syntaxe java est un peu rouillée, mais si elle est traitée comme un pseudocode, la suivante fonctionnera

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

Ma prise:

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)
Si vous excluez la fonction concat() utilisée pour concaténer deux tableaux, cela se fait en une seule ligne:
double[][] d1 = concat(Arrays.copyOf(d, 3), Arrays.copyOfRange(d, 4, 5));
Voir cette question également. C’est de là que vient le code de la (2) fonction.

<=>
Cette méthode est plus rapide et utilise uniquement les fonctions déjà disponibles.

Puisqu'il ne peut pas éviter de créer un nouveau tableau 2D contenant les données supprimées, créez tout d'abord un nouveau 2D int [] [] b avec la même dimension qu'un [] []. Deuxièmement, parcourez a [] [], affectez a à b et déplacez b ligne vers le haut quand un contient une valeur spécifique. et santé mentale vérifier la dernière ligne, qui peut contenir des données spécifiques.

public static int[][] remove(int[][] a, int v) {
    int r = a.length;
    int c = a[0].length;

    int[][] b = new int[r][c];

    int red = 0;
    boolean s = false;
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            b[i - red][j] = a[i][j];
            if (a[i][j] == v) {
                red += 1;
                if(i==r-1){
                    s = true;
                }
                break;
            }
        }
    }
    //check last row
    if(s){
    for(int i = r-red;i <r-red +1; i++ )
        for (int j = 0; j<c; j++){
            b[i][j] = 0;
        }
    }
    return b;
}

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

    print(remove(a, 10));


}

public static void print(int[][] a) {
    int r = a.length;
    int c = a[0].length;


    int red = 0;
    for (int i = 0; i < r; i++) {
        System.out.printf("\nrow %d, \n", i);
        for (int j = 0; j < c; j++) {
            System.out.printf("%d, ", a[i][j]);
        }
    }
}

Ce n'est peut-être pas une solution exacte, mais un concept sur la manière de l'obtenir à l'aide de System.arraycopy.

Dans l'exemple ci-dessous, je souhaite copier toutes les lignes sauf la première. Dans votre cas, vous pouvez ignorer les lignes qui en contiennent 10.

String[][] src = getSheetData(service, spreadSheetId, range);
String[][] dest = new String[src.length-1][src[0].length];

for (int i = 1; i < src.length; i++) {
System.arraycopy(src[i], 0, dest[i-1], 0, src[0].length-1);
}

Référence: https://docs.oracle.com/javase/6/docs/api/java/lang/System.html#arraycopy%28java.lang .Object,% 20int,% 20java.lang.Object,% 20int,% 20int% 29

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top