2012-06-12 23 views
148

Ich habe ein Array von Ganzzahlen in Java, ich möchte nur einen Teil davon verwenden. Ich weiß in Python, dass Sie etwas wie dieses Array [index:] tun können und es das Array aus dem Index zurückgibt. Ist so etwas in Java möglich.nur Teil eines Arrays in Java erhalten?

+0

mögliches Duplikat von [Ein Segment eines Arrays in Java erfassen, ohne ein neues Array auf dem Heap zu erstellen] (http://stackoverflow.com/questions/1100371/grab-a-segment-of-an-array-in- Java-ohne-Erstellung-ein-neues-Array-on-Heap) –

Antwort

240

Verwenden copyOfRange Methode aus java.util.Arrays Klasse:

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

start ist der Anfangsindex des Bereichs kopiert werden, inklusive.
endIndex ist der endgültige Index der zu kopierenden Bereich, exklusiv. (Dieser Index außerhalb des Arrays liegen kann)

ZB:

//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

scheint es eine Größenbeschränkung sein? nur das funktioniert: 'Arrays.copyOfRange (Thread.currentThread(). getStackTrace(), 1,255)' als anstelle von 255 kann ich Integer nicht verwenden.MAX_VALUE, falls ich nicht die tatsächliche Länge –

+0

@AquariusPower erhalten möchte, ist die Größe der Array-Größe und sie kann größer als 255 sein. Sie können einfach keinen 'endIndex' bereitstellen, der größer als die Größe des als erstes übergebenen Arrays ist Streit. Also, wenn Sie eine vollständige Kopie wollen, erstellen Sie eine Variable, die auf dieses Array verweist, und verwenden Sie 'Arrays.copyOfRange (var, 0, var.length)' oder 'Arrays.copyOf (var, var.length)' – elias

+0

würde ich müssen Erstellen Sie eine lokale Variable für das Stacktrace-Sub-Array, aber ich habe festgestellt, dass dies funktioniert !!! 'Arrays.copyOfRange (Thread.currentThread(). GetStackTrace(), 1, Short.MAX_VALUE)' –

18

Ja, Sie Arrays.copyOfRange

Es tut über die gleiche Sache verwenden (beachten Sie, es ist eine Kopie: Sie ändern sich nicht das ursprüngliche Array).

+2

Das heißt, wenn Sie keine explizite Kopie erstellen wollen, müssen Sie eine 'List' und eine' subList' verwenden, wie in der Antwort von @K-ballo beschrieben. –

+0

Das stimmt. Java verfügt nicht über die Array-Slicing-Funktionen, die modernere Sprachen bieten. –

+0

Ich bin mir nicht sicher, ob ich es so sagen würde, aber ... ja, Java bietet kein Array Slicing. (Allerdings gibt es einige Vorteile für diesen Ansatz: weniger Möglichkeiten für Speicherlecks, weniger Array-Overhead durch Vermeiden der zusätzlichen Felder usw. Sie könnten in beide Richtungen gehen.) –

2

Check out copyOfRange; und Beispiel:

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

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/18707191) –

20

Sie könnten Ihr Array als Liste umhüllen und eine Unterliste davon anfordern.

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

Wenn Sie mit Java 1.6 oder höher, können Sie Arrays.copyOfRange verwenden, um einen Teil des Arrays zu kopieren. Aus dem Javadoc:

Kopiert den angegebenen Bereich des angegebenen Arrays in ein neues Array. Der Anfangsindex des Bereichs (von) muss zwischen Null und original.length (einschließlich) liegen. Der Wert original[from] wird in das Anfangselement der Kopie eingefügt (außer from == original.length oder from == to). Werte von nachfolgenden Elementen im ursprünglichen Array werden in nachfolgenden Elementen in der Kopie platziert. Der endgültige Index des Bereichs (to), der größer oder gleich from sein muss, kann größer als original.length sein. In diesem Fall wird false in allen Elementen der Kopie platziert, deren Index größer oder gleich original.length - from ist. Die Länge des zurückgegebenen Arrays ist to - from. Hier

ist ein 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

Sie können versuchen:

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

Siehe javadoc for System.