51 votes

Comment obtenir un sous-tableau de tableau en Java, sans copier de données?

J'ai une bibliothèque de classes, de travail avec mes données, ce qui est en cours de lecture dans la mémoire tampon. Est ce que c'est possible pour éviter la copie de tableaux de nouveau et de nouveau, passant de parties de données de plus en plus profond dans les méthodes de traitement? Eh bien, il semble étrange, mais dans mon cas particulier, il y a un spécial écrivain, qui divise les données en blocs et à l'écrit-les individuellement dans des endroits différents, de sorte qu'il effectue simplement le Système.arraycopy, obtient ce dont il a besoin et les appels de sous-jacents de l'écrivain, avec ce nouveau sous-tableau. Et cela se produit de nombreuses fois. Quelle est la meilleure approche pour refactoriser le code?

68voto

Ricky Clarkson Points 1724
 Arrays.asList(array).subList(x, y).
 

Cette méthode ne vous donne pas un tableau, mais un List , ce qui est beaucoup plus flexible.

23voto

Markus Kull Points 916

De nombreuses classes en Java acceptent un sous-ensemble de tableaux comme paramètre. Par exemple Writer.write (char cbuf [], int off, int len). Peut-être que cela suffit déjà pour votre cas d'utilisation.

12voto

Roman Nikitchenko Points 3085

Voici un exemple d'encapsulation utilisant java.nio.ByteBuffer . Cela devrait être très proche de ce dont vous avez besoin. Au moins pour certaines opérations.

 byte [] a2 = {0, 0, 1, 0};
ByteBuffer buf = ByteBuffer.wrap(a1,0,3);
 

Juste un avertissement, buf.array() renvoie le tableau d'origine (backend) avec tous les éléments.

2voto

rsp Points 14367

Vous pouvez adopter la même approche que la classe String ; créer une classe pour les objets immuables qui sont construits à partir d'un tableau, un décalage de début et un décalage de fin qui offre un accès au sous-tableau. L'utilisateur d'un tel objet n'a pas à connaître la distinction entre l'ensemble du tableau ou un sous-tableau. Le constructeur n'a pas à copier le tableau, il suffit de stocker la référence du tableau et ses limites.

-3voto

Manuel Selva Points 5760

Jetez un œil aux méthodes Arrays.copyOfRange(***) .

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