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.