Tengo una matriz de enteros en Java, me gustaría usar solo una parte de ella. Sé que en Python puedes hacer algo como esta matriz [index:] y devuelve la matriz del índice. Es posible algo así en Java.
Tengo una matriz de enteros en Java, me gustaría usar solo una parte de ella. Sé que en Python puedes hacer algo como esta matriz [index:] y devuelve la matriz del índice. Es posible algo así en Java.
Respuestas:
La longitud de una matriz en Java es inmutable. Por lo tanto, debe copiar la parte deseada como una nueva matriz.
Utilice el copyOfRange
método de la clase java.util.Arrays :
int[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);
startIndex es el índice inicial del rango que se copiará, inclusive.
endIndex es el índice final del rango a copiar, exclusivo. (Este índice puede estar fuera de la matriz)
P.ej:
//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)
endIndex
tamaño mayor que la matriz aprobada como primer argumento. Entonces, si desea una copia completa, cree una variable que se refiera a esta matriz y use Arrays.copyOfRange(var, 0, var.length)
oArrays.copyOf(var, var.length)
Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
ArrayIndexOutOfBoundsException
.
Sí, puedes usar Arrays.copyOfRange
Hace casi lo mismo (tenga en cuenta que hay una copia: no cambia la matriz inicial).
List
y subList
como se indica en la respuesta de @ K-ballo.
Puedes probar:
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);
Ver javadoc para Sistema .
Si está utilizando Java 1.6 o superior, puede usar Arrays.copyOfRange
para copiar una parte de la matriz. Desde el javadoc:
Copia el rango especificado de la matriz especificada en una nueva matriz. El índice inicial del rango (desde) debe estar entre cero e
original.length
inclusive. El valor enoriginal[from]
se coloca en el elemento inicial de la copia (a menos quefrom == original.length
ofrom == to
). Los valores de elementos posteriores en la matriz original se colocan en elementos posteriores en la copia. El índice final del rango (to
), que debe ser mayor o igual quefrom
, puede ser mayor queoriginal.length
, en cuyo casofalse
se coloca en todos los elementos de la copia cuyo índice es mayor o igual queoriginal.length - from
. La longitud de la matriz devuelta seráto - from
.
Aquí hay un ejemplo simple :
/**
* @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]);
}
}
Echa un vistazo a copyOfRange ; y ejemplo:
int[] arr2 = Arrays.copyOfRange(arr,0,3);
Puedes usar algo como esto: Arrays#copyOfRange
Puede usar el subList(int fromIndex, int toIndex)
método en sus enteros arr, algo como esto:
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 + " ");
}
}
La salida será: 2 3
.
Tenga en cuenta que el subList(int fromIndex, int toIndex)
método realiza menos 1 en la segunda variable que recibe (var2 - 1), no sé exactamente por qué, pero eso es lo que sucede, tal vez para reducir la posibilidad de exceder el tamaño de la matriz.
Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,255)
como en lugar de 255 no puedo usar Integer.MAX_VALUE, en caso de que no quiera obtener la longitud real