Bagaimana cara membuat sub array dari array lain di Jawa?

284

Bagaimana cara membuat sub-array dari array lain? Apakah ada metode yang mengambil indeks dari array pertama seperti:

methodName(object array, int start, int end)

Saya tidak ingin pergi membuat loop dan membuat program saya menderita.

Saya terus mendapatkan kesalahan:

tidak dapat menemukan metode simbol copyOfRange (int [], int, int)

Ini kode saya:

import java.util.*;

public class testing 
{
    public static void main(String [] arg) 
    {   
        int[] src = new int[] {1, 2, 3, 4, 5}; 
        int b1[] = Arrays.copyOfRange(src, 0, 2);
    }
}
Mendapatkan
sumber

Jawaban:

305

Kamu bisa memakai

JDK> 1.5

Arrays.copyOfRange(Object[] src, int from, int to)

Javadoc

JDK <= 1.5

System.arraycopy(Object[] src, int srcStartIndex, Object[] dest, int dstStartIndex, int lengthOfCopiedIndices); 

Javadoc

Jigar Joshi
sumber
3
Saya mengalami beberapa masalah dengan tidak memiliki Object [] di dalam Arrays.copyOfRange saya. Periksa impor Anda untuk memastikan Anda menggunakan java.util.Arrays. Entah bagaimana versi Array yang berbeda diimpor dan saya menghabiskan 15 menit memeriksa JRE dan JDK untuk masalah ini.
NuclearPeon
@NuclearPeon Terima kasih !!! Akan memakan waktu lama sebelum saya menemukan jawabannya sendiri. Gerhana diimpor secara otomatis org.bouncycastle.util.Arrays.
anddero
136

Arrays.copyOfRange(..)telah ditambahkan di Java 1.6. Jadi mungkin Anda tidak memiliki versi terbaru. Jika tidak memungkinkan untuk ditingkatkan, lihatSystem.arraycopy(..)

Bozho
sumber
1
@Sami baik upgrade ke 1.6 atau melihat doc ini untuk referensi download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigar Joshi
4
Dari vendor mana JDK Anda berasal. Sun / Oracle tidak pernah merilis versi 4.00.28 dan google juga tidak dapat menemukannya.
Peter Lawrey
copyOfRange null membuntuti elemen jika elemen-elemen itu keluar dari jangkauan array sumber alih-alih mengalokasikan array yang lebih kecil :(
Daneel S. Yaitskov
12
seseorang harus menambahkan jawaban bahwa sementara "indeks awal" inklusif, "indeks akhir" eksklusif
Yan King Yin
@YanKingYin Anda benar - inilah tepatnya yang saya baca di komentarnya :)
Ben Kushigian
43

Gunakan metode copyOfRange dari kelas java.util.Arrays:

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

Untuk lebih jelasnya:

Tautan ke pertanyaan serupa

Dhirendra Pratap
sumber
20

Ya, ini disebut System.arraycopy (Object, int, Object, int, int) .

Ini masih akan melakukan loop di suatu tempat, kecuali jika ini bisa dioptimalkan menjadi sesuatu seperti REP STOSWoleh JIT (dalam hal ini loop berada di dalam CPU).

int[] src = new int[] {1, 2, 3, 4, 5};
int[] dst = new int[3];

System.arraycopy(src, 1, dst, 0, 3); // Copies 2, 3, 4 into dst
Gerco Dries
sumber
7

Menggunakan Apache ArrayUtils yang dapat diunduh di tautan ini Anda dapat dengan mudah menggunakan metode ini

subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) 

"Boolean" hanyalah sebuah contoh, ada metode untuk semua tipe java primitif

Alessandro Muzzi
sumber
6

JDK> = 1.8

Saya setuju dengan semua jawaban di atas. Ada juga cara yang baik dengan Java 8 Streaming:

int[] subArr = IntStream.range(startInclusive, endExclusive)
                        .map(i -> src[i])
                        .toArray();

Manfaatnya adalah, ini dapat berguna untuk berbagai jenis array "src" dan membantu meningkatkan operasi penulisan pipa pada stream.

Tidak khusus tentang pertanyaan ini, tetapi misalnya, jika array sumber adalah double[]dan kami ingin mengambil average()sub-array:

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();
enator
sumber
3
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);
Milan Jaros
sumber
2

Kode sudah benar jadi saya menduga Anda menggunakan JDK yang lebih lama. Javadoc untuk metode itu mengatakan sudah ada sejak 1.6. Pada tipe baris perintah:

java -version

Saya menduga Anda tidak menjalankan 1.6

Merky
sumber
1

Saya Anda menggunakan java sebelum menggunakan versi 1.6 System.arraycopy()sebagai gantinya. Atau tingkatkan lingkungan Anda.

AlexR
sumber