Ottieni solo una parte di un array in Java?


275

Ho una serie di numeri interi in Java, vorrei usarne solo una parte. So che in Python puoi fare qualcosa come questo array [indice:] e restituisce l'array dall'indice. È qualcosa di simile possibile in Java.

Risposte:


444

La lunghezza di un array in Java è immutabile. Pertanto, è necessario copiare la parte desiderata come nuovo array.
Utilizzare il copyOfRangemetodo dalla classe java.util.Arrays :

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

startIndex è l'indice iniziale dell'intervallo da copiare, incluso.
endIndex è l'indice finale dell'intervallo da copiare, esclusivo. (Questo indice potrebbe trovarsi all'esterno dell'array)

Per 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)

sembra esserci un limite di dimensione? funziona solo questo: Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,255)come invece di 255 non posso usare Integer.MAX_VALUE, nel caso in cui non volessi ottenere la lunghezza reale
Aquarius Power,

@AquariusPower il limite di dimensione è la dimensione dell'array e può essere maggiore di 255. Non è possibile fornire una endIndexdimensione maggiore dell'array passato come primo argomento. Quindi, se si desidera una copia completa, creare una variabile facendo riferimento a questo array e utilizzare Arrays.copyOfRange(var, 0, var.length)oArrays.copyOf(var, var.length)
elias

Avrei dovuto creare un var locale per il sub-array stacktrace, ma ho scoperto che funziona !!! Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
Aquarius Power il

Stai attento ArrayIndexOutOfBoundsException.
elias,

1
c'è un altro problema. E se avessi bisogno di dividere l'array di stringhe di lunghezza dire 500K nei sottocampioni di 250K. Questo metodo accetta interegr che raggiungono il massimo a 65000.
Vishnu Dahatonde,

31

È possibile includere il proprio array come elenco e richiederne un elenco secondario.

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

22

Sì, puoi usare Arrays.copyOfRange

Fa più o meno la stessa cosa (nota che c'è una copia: non cambi l'array iniziale).


2
Detto questo, se non vuoi fare una copia esplicita, dovrai usare a Liste a subListcome indicato nella risposta di @ K-ballo.
Louis Wasserman,

Giusto. Java non ha le funzionalità di suddivisione in array offerte dalle lingue più moderne.
Denys Séguret,

Non sono sicuro che lo direi in questo modo, ma ... sì, Java non offre lo slicing dell'array. (Detto questo, ci sono alcuni vantaggi di questo approccio: possibilità ridotte di perdite di memoria, riduzione del sovraccarico dell'array evitando i campi extra, ecc. Si potrebbe andare in entrambi i modi.)
Louis Wasserman,

Sì, hai di nuovo ragione (e non ho provato ad iniziare una guerra di fiamma;)). L'affettatura rende GC molto complesso. E quando Java ha provato lo slicing implicito basato sugli oggetti in Strings ha reso più evidente che questo era pericoloso .
Denys Séguret,

11

Puoi 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 per il sistema .


3
Adoro il modo in cui questo è esattamente il modo in cui Arrays.copyOf () e Arrays.copyOfRange () sono effettivamente implementati (controlli sans bounds) e tuttavia non ottiene voti mentre i wrapper del metodo di utilità ambientale leggermente più alti raccolgono i voti nonostante la datazione System.arraycopy ritorno al 1995.
Dave,

1
Immagino che non sembri abbastanza "moderno" per alcuni.
Dave,

Mi piace andare alla vecchia scuola, niente campane lucenti e fischietti solo i macchinari necessari. Come memcpy in C
StvnBrkdll,

Ma l'uso di arrays.copyOfRange () aumenta la leggibilità e riduce significativamente la possibilità di bug.
Florian F,

7

Se si utilizza Java 1.6 o versione successiva, è possibile utilizzare Arrays.copyOfRangeper copiare una parte dell'array. Dal javadoc:

Copia l'intervallo specificato dell'array specificato in un nuovo array. L'indice iniziale dell'intervallo (da) deve essere compreso tra zero e original.length, incluso. Il valore in original[from]viene inserito nell'elemento iniziale della copia (a meno che from == original.lengtho 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 falseviene 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 semplice esempio :

/**
 * @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]);
    }

}



-2

Puoi usare il subList(int fromIndex, int toIndex)metodo sui tuoi numeri interi arr, qualcosa del genere:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> arr = new ArrayList<>();
        arr.add(1);
        arr.add(2);
        arr.add(3);
        arr.add(4);
        List<Integer> partialArr = arr.subList(1, 3);

        // print the subArr
        for (Integer i: partialArr)
            System.out.println(i + " ");
    }
}

Uscita sarà: 2 3.

Si noti che il subList(int fromIndex, int toIndex)metodo esegue meno 1 sulla seconda variabile che riceve (var2 - 1), non so esattamente perché, ma è quello che succede, forse per ridurre la possibilità di superare le dimensioni dell'array.

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.