Dapatkan hanya sebagian dari Array di Jawa?

275

Saya memiliki array Integer di Jawa, saya hanya ingin menggunakan sebagian saja. Saya tahu dengan Python Anda bisa melakukan sesuatu seperti array [index:] ini dan mengembalikan array dari indeks. Apakah hal seperti ini dimungkinkan di Jawa.

Borut Flis
sumber

Jawaban:

444

Panjang array di Java tidak dapat diubah. Jadi, Anda perlu menyalin bagian yang diinginkan sebagai array baru.
Gunakan copyOfRangemetode dari kelas java.util.Arrays :

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

startIndex adalah indeks awal rentang yang akan disalin, inklusif.
endIndex adalah indeks akhir dari rentang yang akan disalin, eksklusif. (Indeks ini mungkin berada di luar array)

Misalnya:

   //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)
elias
sumber
sepertinya ada batas ukuran? hanya ini yang berfungsi: Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,255)karena alih-alih 255 saya tidak bisa menggunakan Integer.MAX_VALUE, kalau-kalau saya tidak ingin mendapatkan panjang sebenarnya
Aquarius Power
@ AquariusPower batas ukuran adalah ukuran array, dan bisa lebih besar dari 255. Anda tidak bisa memberikan yang endIndexlebih besar dari ukuran array yang dilewati sebagai argumen pertama. Jadi, jika Anda ingin salinan lengkap, buat variabel yang merujuk ke array ini dan gunakan Arrays.copyOfRange(var, 0, var.length)atauArrays.copyOf(var, var.length)
elias
Saya harus membuat var lokal untuk sub-array stacktrace, tetapi saya menemukan bahwa ini berfungsi !!! Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
Aquarius Power
Berhati-hatilah ArrayIndexOutOfBoundsException.
elias
1
ada masalah lain. Bagaimana jika saya perlu membagi panjang array string katakan 500K ke dalam subarrays 250K. Metode ini menerima interegr yang maksimal pada 65000.
Wisnu Dahatonde
31

Anda bisa membungkus array Anda sebagai daftar, dan meminta sublist dari itu.

MyClass[] array = ...;
List<MyClass> subArray = Arrays.asList(array).subList(index, array.length);
K-ballo
sumber
22

Ya, Anda bisa menggunakannya Arrays.copyOfRange

Itu melakukan hal yang sama (perhatikan ada salinan: Anda tidak mengubah array awal).

Denys Séguret
sumber
2
Yang mengatakan, jika Anda tidak ingin membuat salinan eksplisit, Anda harus menggunakan a Listdan a subListseperti diuraikan dalam jawaban @ K-ballo.
Louis Wasserman
Betul sekali. Java tidak memiliki fasilitas pengiris larik yang ditawarkan oleh bahasa yang lebih modern.
Denys Séguret
Saya tidak yakin apakah saya akan mengatakannya seperti itu, tapi ... ya, Java tidak menawarkan irisan array. (Yang mengatakan, ada beberapa keuntungan untuk pendekatan ini: mengurangi kemungkinan kebocoran memori, mengurangi overhead array dengan menghindari bidang tambahan, dll. Anda bisa memilih jalan yang lain.)
Louis Wasserman
Ya, Anda benar lagi (dan saya tidak mencoba memulai perang api;)). Mengiris membuat GC sangat kompleks. Dan ketika Jawa memang mencoba mengiris objek berbasis implisit di Strings itu membuatnya lebih jelas bahwa ini berbahaya .
Denys Séguret
11

Anda dapat mencoba:

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

Lihat javadoc untuk Sistem .

StvnBrkdll
sumber
3
Saya hanya suka bagaimana ini persis bagaimana Arrays.copyOf () dan Arrays.copyOfRange () sebenarnya diimplementasikan (tanpa batas memeriksa) dan namun tidak mendapat suara sementara metode utilitas overhead yang sedikit lebih tinggi membungkus suara meskipun Sistem.arraycopy berkencan kembali ke 1995.
Dave
1
Saya kira itu tidak cukup "modern" untuk beberapa orang.
Dave
Saya suka pergi ke sekolah tua, tidak ada lonceng mengkilap dan peluit hanya mesin yang diperlukan. Seperti memcpy di C
StvnBrkdll
Tetapi menggunakan arrays.copyOfRange () meningkatkan keterbacaan dan secara signifikan mengurangi kemungkinan bug.
Florian F
7

Jika Anda menggunakan Java 1.6 atau lebih tinggi, Anda bisa menggunakannya Arrays.copyOfRangeuntuk menyalin sebagian array. Dari javadoc:

Menyalin kisaran yang ditentukan dari array yang ditentukan ke dalam array yang baru. Indeks awal rentang (dari) harus berada di antara nol dan original.length, inklusif. Nilai at original[from]ditempatkan pada elemen awal salinan (kecuali from == original.lengthatau from == to). Nilai dari elemen berikutnya dalam array asli ditempatkan ke elemen berikutnya dalam salinan. Indeks akhir rentang ( to), yang harus lebih besar dari atau sama dengan from, mungkin lebih besar dari original.length, dalam hal falseini ditempatkan di semua elemen salinan yang indeksnya lebih besar dari atau sama dengan original.length - from. Panjang array yang dikembalikan akan menjadi to - from.

Ini adalah contoh sederhana :

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

}
Justin Ethier
sumber
3

Lihat copyOfRange ; dan contoh:

int[] arr2 = Arrays.copyOfRange(arr,0,3);
dcp
sumber
-2

Anda dapat menggunakan subList(int fromIndex, int toIndex)metode pada bilangan bulat arr Anda, sesuatu seperti ini:

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 + " ");
    }
}

Output akan menjadi: 2 3 .

Perhatikan bahwa subList(int fromIndex, int toIndex)metode melakukan minus 1 pada variabel ke-2 yang diterimanya (var2 - 1), saya tidak tahu persis mengapa, tapi itulah yang terjadi, mungkin untuk mengurangi kemungkinan melebihi ukuran array.

A. Ab
sumber