Comment aplatir un tableau 2D en tableau 1D?

Comment puis-je aplatir le tableau de 2 dimensions int originalArray[][] 1 dimension de tableau?

    int a [] = {1,2,6,7,2};
    int b [] = {2,44,55,2};
    int c [] = {2,44,511,33};

    int originalArray [][] = new int[][]{a,b,c};
19
demandé sur Eric Duminil 2010-04-03 01:26:13

7 réponses

un simple pour boucle fera l'affaire, ce n'est pas difficile, mais dépendra de l'ordre dans lequel vous voulez copier les valeurs. Par exemple (basé sur le fait que dans votre exemple, les tableaux ont tous la même longueur):

int[] newArray = new int[3 * a.length];
int index = 0;
for (int n = 0; n < a.length; n++) {
    newArray[index++] = a[n];
    newArray[index++] = b[n];
    newArray[index++] = c[n];
}

ou (ordre différent, a, b, c peuvent être de longueurs différentes):

int[] newArray = new int[a.length + b.length + c.length];
System.arrayCopy(a, 0, newArray, 0, a.length);
System.arrayCopy(b, 0, newArray, a.length, b.length);
System.arrayCopy(c, 0, newArray, a.length + b.length, c.length);
6
répondu rsp 2010-04-02 21:32:47

Goyave, vous pouvez utiliser

int[] all = Ints.concat(originalArray);

ou

int[] all = Ints.concat(a, b, c);

40
répondu Kevin Bourrillion 2010-04-08 05:31:19
int[] flatArray = Arrays.stream(originalArray)
        .flatMapToInt(Arrays::stream)
        .toArray();

ou:

int[] flatArray = Stream.of(a, b, c)
        .flatMapToInt(Arrays::stream)
        .toArray();
24
répondu assylias 2015-02-03 17:57:59

Il y aura 2 étapes:

1) trouver le nombre total d'éléments pour créer un nouveau vecteur (tableau 1d)

2) itérez votre tableau 2d dans un ordre prédéfini et copiez ses éléments dans le vecteur créé

int elementsNumber = 0;

for (int i = 0; i < originalArray.length; i++) {
   elementsNumber += originalArray[i].length;
}

int[] newArray = new int[elementsNumber];
int j = 0;
for (int i = 0; i < originalArray.length; i++) {
   System.arrayCopy (originalArray[i], 0, newArray, j, originalArray[i].length);
   j += originalArray[i].length;
}
4
répondu Roman 2010-04-02 21:30:17

puisque les tableaux ne peuvent pas être étendus( i.e. vous devez déclarer la taille d'une erreur lors de l'initialisation), vous devez parcourir les tableaux deux fois:

int size = 0;
for (int[] ar : originalArray) size += ar.length;
int[] result = new int[size];
int pos = 0;
for (int[] ar : originalArray) {
    System.arraycopy(ar, 0, result, pos, ar.length);
    pos += ar.length;
}
2
répondu phihag 2010-04-02 21:36:38
int[] oneDArray = new int[arr.length*arr.length];
    //Flatten 2D array to 1D array...
    int s = 0;
    for(int i = 0; i < arr.length; i ++) 
          for(int j = 0; j < arr.length; j ++){                           
              oneDArray[s] = arr[i][j];
              s++;
          } 
2
répondu Nolesh 2013-02-08 14:17:02

Compter le nombre total d'éléments dans originalArray. Créer un nouveau tableau de cette longueur. Copier les éléments un par un dans le nouveau tableau.

Je ne connais aucune fonction de bibliothèque pour le faire.

-1
répondu Thorbjørn Ravn Andersen 2010-04-02 21:29:55