2012-06-12 10 views
148

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 desde el índice. Es algo como esto posible en Java.obtener solo una parte de una matriz en Java?

+0

posible duplicado de [Toma un segmento de una matriz en Java sin crear una nueva matriz en el montón] (http://stackoverflow.com/questions/1100371/grab-a-segment-of-an-array-in- java-without-creating-a-new-array-on-heap) –

Respuesta

240

Uso copyOfRange método de java.util.Arrays clase:

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

startIndex es el índice inicial de la gama para ser copiado, inclusive.
endIndex es el índice final del rango que se va a copiar, exclusivo. (Este índice puede estar fuera de la matriz)

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) 
+0

parece que hay un límite de tamaño? solo esto funciona: 'Arrays.copyOfRange (Thread.currentThread(). getStackTrace(), 1,255)' ya que en lugar de 255 no puedo usar Integer.MAX_VALUE, en caso de que no quiera obtener la longitud real –

+0

@AquariusPower el límite de tamaño es el tamaño de la matriz, y puede ser mayor que 255. Simplemente no se puede proporcionar un 'endIndex' más grande que el tamaño de la matriz pasada como la primera argumento. Entonces, si quieres una copia completa, crea una variable que se refiera a esta matriz y usa 'Arrays.copyOfRange (var, 0, var.length)' o 'Arrays.copyOf (var, var.length)' – elias

+0

Tendría que crear una var local para la sub-matriz de stacktrace, ¡pero encontré que esto funciona! 'Arrays.copyOfRange (Thread.currentThread(). GetStackTrace(), 1, Short.MAX_VALUE)' –

18

sí, se puede utilizar Arrays.copyOfRange

Lo hace de lo mismo (en cuenta que hay una copia: no lo hace el cambio la matriz inicial).

+2

Dicho esto, si no quiere hacer una copia explícita, necesitará usar 'List' y' subList' como se indica en la respuesta de @K-ballo. –

+0

Eso es correcto. Java no tiene las funciones de corte de matriz que ofrecen los idiomas más modernos. –

+0

No estoy seguro de haberlo dicho así, pero ... sí, Java no ofrece cortes de matriz. (Dicho esto, hay algunas ventajas en este enfoque: reducción de las posibilidades de pérdida de memoria, reducción de la sobrecarga de la matriz al evitar los campos adicionales, etc. Se puede ir de cualquier manera). –

2

Salida copyOfRange; y ejemplo:

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

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la opinión] (/ reseña/mensajes de baja calidad/18707191) –

20

Puede ajustar su matriz como una lista y solicitar una sublista de la misma.

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

Si está utilizando Java 1.6 o superior, puede utilizar Arrays.copyOfRange para copiar una parte de la matriz. Desde javadoc:

Copia el rango especificado de la matriz especificada en una nueva matriz. El índice inicial del rango (desde) debe estar entre cero y original.length, inclusive. El valor en original[from] se coloca en el elemento inicial de la copia (a menos que from == original.length o from == to). Los valores de los elementos subsiguientes en la matriz original se colocan en los elementos subsiguientes en la copia. El índice final del rango (to), que debe ser mayor o igual a from, puede ser mayor que original.length, en cuyo caso false se coloca en todos los elementos de la copia cuyo índice es mayor o igual que original.length - from. La longitud de la matriz devuelta será to - from.

Aquí es una 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

Usted puede tratar de:

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 for System.

Cuestiones relacionadas