183 votes

Saisir un segment d'un tableau en Java

Je cherche une méthode en Java qui retournera un segment d'un tableau. Un exemple serait d'obtenir le tableau d'octets contenant les 4ème et 5ème octets d'un tableau d'octets. Je ne veux pas avoir à créer un nouveau tableau d'octets dans la mémoire du tas juste pour cela. En ce moment j'ai le code suivant:

 doSomethingWithTwoBytes(byte[] twoByteArray);

void someMethod(byte[] bigArray)
{
      byte[] x = {bigArray[4], bigArray[5]};
      doSomethingWithTwoBytes(x);
}
 

Je voudrais savoir s'il y a un moyen de faire juste doSomething(bigArray.getSubArray(4, 2)) où 4 est le décalage et 2 est la longueur, par exemple.

Quelqu'un sait?

185voto

unhillbilly Points 4604

Je ne connais pas de moyen de le faire directement avec les tableaux sans complément d'allocation de tas, mais les autres réponses à l'aide d'une liste de sous-wrapper ont allocation supplémentaire pour le wrapper seulement – mais pas le tableau – ce qui serait utile dans le cas d'un grand tableau.

Cela dit, si on est à la recherche pour des raisons de concision, la méthode utilitaire Arrays.copyOfRange() a été introduite dans Java 6 (fin 2006?):

byte [] a = new byte [] {0, 1, 2, 3, 4, 5, 6, 7};

// get a[4], a[5]

byte [] subArray = Arrays.copyOfRange(a, 4, 6);

172voto

unique72 Points 571

Arrays.asList(myArray) délègue au nouveau ArrayList(myArray) qui ne copie pas le tableau mais enregistre simplement la référence. Ensuite, en utilisant List.subList(start, end) crée un SubList qui fait simplement référence à la liste originale (qui ne fait toujours référence qu'au tableau). Aucune copie du tableau ou de son contenu, juste la création du wrapper et toutes les listes impliquées sont sauvegardées par le tableau d'origine. (Je pensais que ce serait plus lourd.)

39voto

djna Points 34761

Si vous recherchez une approche par aliasing de style pointeur, de sorte que vous n’ayez même pas besoin d’allouer de l’espace et de copier les données, je crois que vous n’avez pas de chance.

System.arraycopy () copiera de votre source vers la destination et l'efficacité est revendiquée pour cet utilitaire. Vous devez attribuer le tableau de destination.

20voto

James Schek Points 11070

Utilisez les java.nio.Buffer. C'est un wrapper léger pour les tampons de différents types primitifs et aide à gérer le découpage, la position, la conversion, l'ordre des octets, etc.

Si vos octets proviennent d'un flux, les tampons NIO peuvent utiliser le "mode direct" qui crée un tampon sauvegardé par les ressources natives. Cela peut améliorer les performances dans de nombreux cas.

14voto

seth Points 18409

Vous pouvez utiliser le ArrayUtils.subarray dans les commodes apache. Pas parfait mais un peu plus intuitif que System.arraycopy. L'inconvénient est qu'il introduit une autre dépendance dans votre code.

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