web-dev-qa-db-fra.com

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

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

methodName(object array, int start, int end)

Je ne veux pas faire des boucles et faire souffrir mon programme.

Je continue à avoir des erreurs:

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

Ceci est 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);
    }
}
266
Gain

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

284
Jigar Joshi

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

135
Bozho

Utilisez la méthode copyOfRange de la classe Java.util.Arrays:

int[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);

Pour plus de détails:

Lien vers une question similaire

40
Dhirendra Pratap

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

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

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
20
Gerco Dries

Utiliser Apache ArrayUtils téléchargeable à ce lien vous pouvez facilement utiliser la méthode

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

"boolean" n'est qu'un exemple, il existe des méthodes pour toutes les primitives Java types

6
Alessandro Muzzi
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);
3
Milan Jaros

Le code est correct, alors je suppose que vous utilisez un JDK plus ancien. Le javadoc pour cette méthode dit qu'il est là depuis 1.6. Sur la ligne de commande, tapez:

Java -version

Je devine que vous ne courez pas 1.6

2
Merky

JDK> = 1.8

Je suis d'accord avec toutes les réponses ci-dessus. Il y a aussi une bonne manière avec Java 8 Streams:

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

L'avantage à ce sujet est que cela peut être utile pour différents types de tableaux "src" et permet d'améliorer l'écriture d'opérations de pipeline sur le flux.

Pas particulier à propos de cette question, mais par exemple, si le tableau source était double et que nous voulions prendre average() du sous-tableau:

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

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

1
AlexR