Come creare un array secondario da un altro array in Java?


284

Come creare un array secondario da un altro array? Esiste un metodo che accetta gli indici dal primo array come:

methodName(object array, int start, int end)

Non voglio andare oltre facendo loop e facendo soffrire il mio programma.

Continuo a ricevere errori:

impossibile trovare il metodo dei simboli copyOfRange (int [], int, int)

Questo è il mio codice:

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);
    }
}

Risposte:


305

Puoi usare

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
Avevo dei problemi con non avere Object [] s nel mio Arrays.copyOfRange. Controlla le tue importazioni per assicurarti di utilizzare java.util.Arrays. In qualche modo è stata importata una versione Array diversa e ho perso 15 minuti a controllare il problema con JRE e JDK.
NuclearPeon

@NuclearPeon Grazie !!! Mi ci sarebbe voluto molto tempo prima che lo capissi da solo. Eclipse importato automaticamente org.bouncycastle.util.Arrays.
anddero,

136

Arrays.copyOfRange(..)è stato aggiunto in Java 1.6. Quindi forse non hai l'ultima versione. Se non è possibile eseguire l'aggiornamento, guardaSystem.arraycopy(..)


1
@Sami esegui l'upgrade alla 1.6 o consulta questo documento come riferimento download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigar Joshi,

4
Da quale fornitore proviene il tuo JDK. Sun / Oracle non ha mai rilasciato una versione 4.00.28 e Google non è riuscita a trovarla.
Peter Lawrey,

copyOfRange annulla gli elementi finali se sono al di fuori dell'intervallo di array di origine invece di allocare un array più piccolo :(
Daneel S. Yaitskov,

12
qualcuno dovrebbe aggiungere la risposta che mentre "start-index" è inclusivo, "end-index" è esclusivo
Yan King Yin

@YanKingYin hai ragione - questo è esattamente ciò per cui stavo leggendo i commenti :)
Ben Kushigian,


20

Sì, si chiama System.arraycopy (Object, int, Object, int, int) .

Eseguirà comunque un ciclo da qualche parte, a meno che questo non possa essere ottimizzato in qualcosa di simile REP STOSWda JIT (nel qual caso il ciclo si trova all'interno della 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

Usando Apache ArrayUtils scaricabile a questo link puoi usare facilmente il metodo

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

"booleano" è solo un esempio, ci sono metodi per tutti i tipi java di primitivi


6

JDK> = 1.8

Sono d'accordo con tutte le risposte sopra. C'è anche un bel modo con Java 8 Streams:

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

Il vantaggio è che può essere utile per molti tipi diversi di array "src" e aiuta a migliorare le operazioni di scrittura della pipeline sullo stream.

Non particolare su questa domanda, ma per esempio, se l'array di origine era double[]e volevamo prendere average()l'array secondario:

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

Il codice è corretto, quindi immagino che tu stia utilizzando un JDK più vecchio. Il javadoc per quel metodo dice che esiste dall'1.6. Alla riga di comando digitare:

java -version

Immagino che tu non stia eseguendo 1.6


1

Io invece stai usando Java prima della versione 1.6 System.arraycopy(). O aggiorna il tuo ambiente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.