Comment créer un sous-tableau à partir d'un autre tableau en Java?


284

Comment créer un sous-tableau à partir d'un autre tableau? Existe-t-il une méthode qui prend les index du premier tableau comme:

methodName(object array, int start, int end)

Je ne veux pas faire plus de boucles et faire souffrir mon programme.

Je reçois toujours des erreurs:

impossible de trouver la méthode du symbole copyOfRange (int [], int, int)

Voici mon code:

import java.util.*;

public class testing 
{
    public static void main(String [] arg) 
    {   
        int[] src = new int[] {1, 2, 3, 4, 5}; 
        int b1[] = Arrays.copyOfRange(src, 0, 2);
    }
}

Réponses:


305

Vous pouvez utiliser

JDK> 1,5

Arrays.copyOfRange(Object[] src, int from, int to)

Javadoc

JDK <= 1,5

System.arraycopy(Object[] src, int srcStartIndex, Object[] dest, int dstStartIndex, int lengthOfCopiedIndices); 

Javadoc


3
J'avais quelques problèmes avec le fait de ne pas avoir d'objets [] dans mon Arrays.copyOfRange. Vérifiez vos importations pour vous assurer que vous utilisez java.util.Arrays. D'une manière ou d'une autre, une version différente des tableaux a été importée et j'ai perdu 15 minutes à vérifier les JRE et JDK pour le problème.
NuclearPeon

@NuclearPeon Merci !!! Cela m'aurait pris beaucoup de temps avant de le découvrir moi-même. Eclipse importé automatiquement org.bouncycastle.util.Arrays.
anddero

136

Arrays.copyOfRange(..)a été ajouté en Java 1.6. Alors peut-être que vous n'avez pas la dernière version. S'il n'est pas possible de mettre à niveau, regardezSystem.arraycopy(..)


1
@Sami mettez à niveau vers 1.6 ou consultez ce document pour référence download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigar Joshi

4
De quel fournisseur est votre JDK. Sun / Oracle n'a jamais publié de version 4.00.28 et Google ne l'a pas trouvée non plus.
Peter Lawrey

copyOfRange annule les éléments de fin s'ils sont hors de la plage du tableau source au lieu d'allouer un tableau plus petit :(
Daneel S. Yaitskov

12
quelqu'un devrait ajouter dans la réponse que si "start-index" est inclusif, "end-index" est exclusif
Yan King Yin

@YanKingYin vous avez raison - c'est précisément pour cela que je lisais les commentaires :)
Ben Kushigian


20

Oui, cela s'appelle System.arraycopy (Object, int, Object, int, int) .

Il va toujours effectuer une boucle quelque part, à moins que cela ne puisse être optimisé en quelque chose comme REP STOSWpar le JIT (auquel cas la boucle est à l'intérieur du CPU).

int[] src = new int[] {1, 2, 3, 4, 5};
int[] dst = new int[3];

System.arraycopy(src, 1, dst, 0, 3); // Copies 2, 3, 4 into dst

7

En utilisant Apache ArrayUtils téléchargeable sur ce lien, vous pouvez facilement utiliser la méthode

subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) 

"booléen" n'est qu'un exemple, il existe des méthodes pour tous les types java primitifs


6

JDK> = 1,8

Je suis d'accord avec toutes les réponses ci-dessus. Il y a aussi un bon moyen avec Java 8 Streams:

int[] subArr = IntStream.range(startInclusive, endExclusive)
                        .map(i -> src[i])
                        .toArray();

L'avantage à ce sujet est qu'il peut être utile pour de nombreux types différents de tableau "src" et aide à améliorer l'écriture des opérations de pipeline sur le flux.

Pas particulier sur cette question, mais par exemple, si le tableau source était double[]et nous voulions prendre average()du sous-tableau:

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();

3
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);

2

Le code est correct, donc je suppose que vous utilisez un ancien JDK. Le javadoc de cette méthode indique qu'elle existe depuis la 1.6. Sur la ligne de commande, tapez:

java -version

Je suppose que vous n'utilisez pas 1.6


1

Si vous utilisez java avant la version 1.6, utilisez-le à la System.arraycopy()place. Ou mettez à niveau votre environnement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.