40 votes

Diviser le tableau en deux parties sans boucle for en java

J'ai un tableau de taille 300000 et je veux qu'il le divise en 2 parties égales. Y a-t-il une méthode qui peut être utilisée ici pour atteindre cet objectif ?

Sera-t-il plus rapide que l'opération for-loop ou n'aura-t-il aucun effet sur les performances ?

61voto

Martijn Courteaux Points 33836

Vous pouvez utiliser System.arraycopy().

int[] source = new int[1000];

int[] part1 = new int[500];
int[] part2 = new int[500];

//              (src   , src-offset  , dest , offset, count)
System.arraycopy(source, 0           , part1, 0     , part1.length);
System.arraycopy(source, part1.length, part2, 0     , part2.length);

54voto

Pete Points 4035

copyOfRange

Cela fait ce que vous voulez sans que vous ayez à créer un nouveau tableau car il renvoie un nouveau tableau.

int[] original = new int[300000];
int[] firstHalf = Arrays.copyOfRange(original, 0, original.length/2);

9voto

diggi Points 41

Divise un tableau en plusieurs tableaux avec une taille maximale fixe.

public static <T extends Object> List<T[]> splitArray(T[] array, int max){

  int x = array.length / max;
  int r = (array.length % max); // remainder

  int lower = 0;
  int upper = 0;

  List<T[]> list = new ArrayList<T[]>();

  int i=0;

  for(i=0; i<x; i++){

    upper += max;

    list.add(Arrays.copyOfRange(array, lower, upper));

    lower = upper;
  }

  if(r > 0){

    list.add(Arrays.copyOfRange(array, lower, (lower + r)));

  }

  return list;
}

Exemple - un tableau de 11 doit être divisé en plusieurs tableaux n'excédant pas une taille de 5 :

// create and populate an array
Integer[] arr = new Integer[11];

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

// split into pieces with a max. size of 5
List<Integer[]> list = ArrayUtil.splitArray(arr, 5);

// check
for(int i=0; i<list.size(); i++){

  System.out.println("Array " + i);

  for(int j=0; j<list.get(i).length; j++){
    System.out.println("  " + list.get(i)[j]);
  }
}

Sortie :

Array 0
  0
  1
  2
  3
  4
Array 1
  5
  6
  7
  8
  9
Array 2
  10

2voto

Per Holmäng Points 1010

Utilisez System.arraycopy.

0voto

Hitesh Sahu Points 12561

Utilisez ce code, il fonctionne parfaitement pour les tailles de liste impaires ou paires. J'espère qu'il aidera quelqu'un .

 int listSize = listOfArtist.size();
 int mid = 0;
 if (listSize % 2 == 0) {
    mid = listSize / 2;
    Log.e("Parting", "You entered an even number. mid " + mid
                    + " size is " + listSize);
 } else {
    mid = (listSize + 1) / 2;
    Log.e("Parting", "You entered an odd number. mid " + mid
                    + " size is " + listSize);
 }
 //sublist returns List convert it into arraylist * very important
 leftArray = new ArrayList<ArtistModel>(listOfArtist.subList(0, mid));
 rightArray = new ArrayList<ArtistModel>(listOfArtist.subList(mid,
                listSize));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X