HOWTO · Java
Cortar un array en Java
Este artículo lo ayudará a dividir un array en subarray con la ayuda de Java.
En esta página
Para dividir un array de Java, copia los elementos de un rango contiguo en un array nuevo. Los ejemplos siguientes usan un rango con inicio incluido y fin excluido: fromIndex se incluye y toIndex es el primer índice que queda fuera. Por ejemplo, el rango [2, 5) selecciona los índices 2, 3 y 4. El array original no cambia.
Dividir un array de Java duplicando elementos
Un bucle hace explícita la correspondencia entre los índices. Crea el array de resultado con una longitud de toIndex - fromIndex y copia cada valor seleccionado en la posición correspondiente.
Este programa completo selecciona los índices del 1 al 3 de un array de enteros:
import java.util.Arrays;
public class ArraySliceLoop {
static int[] slice(int[] values, int fromIndex, int toIndex) {
int[] result = new int[toIndex - fromIndex];
for (int i = 0; i < result.length; i++) {
result[i] = values[fromIndex + i];
}
return result;
}
public static void main(String[] args) {
int[] values = {10, 20, 30, 40, 50};
int[] part = slice(values, 1, 4);
System.out.println(Arrays.toString(part));
}
}
El resultado es un array independiente. El contador i del bucle empieza en cero para el resultado, mientras que fromIndex + i localiza el elemento correspondiente en el array de origen. Llama al método con índices que definan un rango válido dentro del array de origen.
Dividir un array de Java con el método copyOfRange()
Arrays.copyOfRange() permite crear directamente un array nuevo a partir de un rango. El método pertenece a java.util.Arrays; el argumento from se incluye y el argumento to se excluye. El nombre exacto de la API incluye copyOfRange().
Este programa copia los índices 1, 2 y 3:
import java.util.Arrays;
public class ArraySliceCopyOfRange {
public static void main(String[] args) {
int[] values = {10, 20, 30, 40, 50};
int[] part = Arrays.copyOfRange(values, 1, 4);
System.out.println(Arrays.toString(part));
}
}
El array devuelto contiene los valores seleccionados, y modificarlo no reemplaza elementos del array original. En arrays primitivos como int[], se copian los valores. En arrays de objetos, el array es nuevo, pero sus elementos siguen siendo referencias a los mismos objetos.
Dividir un array de Java con un stream
Un stream puede seleccionar valores del array asignando un flujo de índices a los elementos del array de origen. Considera esta opción como alternativa: úsala solo si el entorno Java configurado para tu proyecto admite las API de streams necesarias. Aquí no se presupone ninguna versión del entorno.
La operación se puede escribir como IntStream.range(fromIndex, toIndex).map(i -> values[i]).toArray(). IntStream.range incluye el inicio y excluye el final, por lo que sigue la misma convención de rangos que los demás métodos. Esta expresión compacta es ilustrativa; comprueba que las API estén disponibles en la versión de Java declarada por tu proyecto antes de usarla. Si no conoces esa versión, un bucle o Arrays.copyOfRange() son alternativas directas.
Dividir un array de Java con el método System.arraycopy
System.arraycopy copia una cantidad determinada de elementos de un array a otro. Crea un array de destino con una longitud de toIndex - fromIndex y pasa la posición de origen, la posición de destino y la cantidad de elementos que se copiarán.
import java.util.Arrays;
public class ArraySliceSystemArraycopy {
public static void main(String[] args) {
int[] values = {10, 20, 30, 40, 50};
int fromIndex = 1;
int toIndex = 4;
int[] part = new int[toIndex - fromIndex];
System.arraycopy(values, fromIndex, part, 0, part.length);
System.out.println(Arrays.toString(part));
}
}
Los argumentos son el array de origen, la posición de origen, el array de destino, la posición de destino y la cantidad de elementos que se copiarán. Aquí la posición de destino es cero, así que el rango seleccionado del array de origen llena part desde su primera posición. Los tipos de elemento de los arrays de origen y destino deben ser compatibles, y las posiciones y la longitud deben caber en ambos arrays.
Dividir un array de Java con asList y subList
Para los arrays de tipos de referencia, Arrays.asList() crea una lista de tamaño fijo respaldada por el array. subList(fromIndex, toIndex) devuelve una vista del rango seleccionado de la lista. Convierte esa vista en un array si necesitas que el resultado sea independiente.
import java.util.Arrays;
import java.util.List;
public class ArraySliceSubList {
public static void main(String[] args) {
String[] values = {"red", "green", "blue", "gold"};
List<String> list = Arrays.asList(values);
List<String> selected = list.subList(1, 3);
String[] part = selected.toArray(new String[0]);
System.out.println(Arrays.toString(part));
}
}
La lista que devuelve Arrays.asList() tiene un tamaño fijo: puedes reemplazar un elemento, pero no añadir ni quitar entradas. La sublista es una vista vinculada a esa lista. Llamar a toArray() crea un array independiente, aunque los elementos objeto siguen siendo referencias a los mismos objetos. Este enfoque sirve para arrays de tipos de referencia como String[]; para los arrays primitivos hacen falta métodos que trabajen con arrays primitivos, como el bucle, copyOfRange() o System.arraycopy mostrados arriba.
Conclusión
Usa un bucle si quieres ver o personalizar la copia elemento por elemento. Elige Arrays.copyOfRange() para copiar directamente un rango a otro array, o System.arraycopy cuando quieras especificar la posición de destino y la cantidad de elementos. Un stream permite seleccionar elementos por índice si el entorno Java del proyecto admite las API necesarias. Para arrays de tipos de referencia, asList y subList proporcionan una vista de lista; llama a toArray() para obtener un array de resultado independiente.