2012-06-12 17 views
148

Ho un array di Integers in Java, vorrei usare solo una parte di esso. So che in Python puoi fare qualcosa come questo array [index:] e restituisce l'array dall'indice. È qualcosa di simile a questo possibile in Java.ottiene solo una parte di una matrice in Java?

+0

possibile duplicato di [Afferra un segmento di un array in Java senza creare un nuovo array nell'heap] (http://stackoverflow.com/questions/1100371/grab-a-segment-of-an-array-in- java-without-creating-a-new-array-on-heap) –

risposta

240

Usa copyOfRange metodo da java.util.Arrays classe:

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

startIndex è l'indice iniziale della gamma da copiare, inclusiva.
endIndex è l'indice finale dell'intervallo da copiare, esclusivo. (Questo indice può trovarsi al di fuori della matrice)

Esempio:

//index 0 1 2 3 4 
int[] arr = {10, 20, 30, 40, 50}; 
Arrays.copyOfRange(arr, 0, 2);   // returns {10, 20} 
Arrays.copyOfRange(arr, 1, 4);   // returns {20, 30, 40} 
Arrays.copyOfRange(arr, 2, arr.length); // returns {30, 40, 50} (length = 5) 
+0

sembra esserci un limite di dimensioni? solo questo funziona: 'Arrays.copyOfRange (Thread.currentThread(). getStackTrace(), 1,255)' come al posto di 255 Non posso usare Integer.MAX_VALUE, nel caso in cui non desideri ottenere la lunghezza reale –

+0

@AquariusPower il limite di dimensione è la dimensione dell'array, e può essere maggiore di 255. Non puoi fornire un 'endIndex' più grande della dimensione dell'array passato come prima discussione. Quindi, se vuoi una copia completa, crea una variabile che si riferisce a questo array e usa 'Arrays.copyOfRange (var, 0, var.length)' o 'Arrays.copyOf (var, var.length)' – elias

+0

Dovrei creare una var locale per il sub-array stacktrace, ma ho scoperto che funziona !!! 'Arrays.copyOfRange (Thread.currentThread(). GetStackTrace(), 1, Short.MAX_VALUE)' –

18

Sì, è possibile utilizzare Arrays.copyOfRange

Si fa la stessa cosa (notare che c'è una copia: non si cambia l'array iniziale).

+2

Detto questo, se non vuoi fare una copia esplicita, dovrai usare un 'List' e un' subList' come descritto nella risposta di @ K-ballo. –

+0

Esatto. Java non ha le strutture per l'affettatura dell'array offerte da lingue più moderne. –

+0

Non sono sicuro se lo direi in questo modo, ma ... sì, Java non offre l'affettatura dell'array. (Detto questo, ci sono alcuni vantaggi a questo approccio: possibilità ridotte di perdite di memoria, sovraccarico di array ridotto evitando i campi extra, ecc. Potresti andare in entrambi i modi.) –

2

Partenza copyOfRange; ed esempio:

int[] arr2 = Arrays.copyOfRange(arr,0,3); 
+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/18707191) –

20

È possibile avvolgere l'array come elenco e richiedere una sottolista.

MyClass[] array = ...; 
List<MyClass> subArray = Arrays.asList(array).subList(index, array.length); 
7

Se si utilizza Java 1.6 o superiore, è possibile utilizzare Arrays.copyOfRange per copiare una parte della matrice. Da javadoc:

Copia l'intervallo specificato della matrice specificata in una nuova matrice. L'indice iniziale dell'intervallo (da) deve essere compreso tra zero e original.length, incluso. Il valore su original[from] viene inserito nell'elemento iniziale della copia (a meno che non sia o from == to). I valori degli elementi successivi nell'array originale vengono inseriti negli elementi successivi nella copia. L'indice finale dell'intervallo (to), che deve essere maggiore o uguale a from, può essere maggiore di original.length, nel qual caso false viene inserito in tutti gli elementi della copia il cui indice è maggiore o uguale a original.length - from. La lunghezza dell'array restituito sarà to - from.

Ecco un simple example:

/** 
* @Program that Copies the specified range of the specified array into a new 
* array. 
* CopyofRange8Array.java 
* Author:-RoseIndia Team 
* Date:-15-May-2008 
*/ 
import java.util.*; 
public class CopyofRange8Array { 
    public static void main(String[] args) { 
     //creating a short array 
     Object T[]={"Rose","India","Net","Limited","Rohini"}; 
     // //Copies the specified short array upto specified range, 
     Object T1[] = Arrays.copyOfRange(T, 1,5); 
     for (int i = 0; i < T1.length; i++) 
      //Displaying the Copied short array upto specified range 
      System.out.println(T1[i]); 
    } 

} 
0

Si può provare:

System.arraycopy(sourceArray, 0, targetArray, 0, targetArray.length);// copies whole array 

// copies elements 1 and 2 from sourceArray to targetArray 
System.arraycopy(sourceArray, 1, targetArray, 0, 2); 

Vedi javadoc for System.

Problemi correlati