วิธีสร้างอาเรย์ย่อยจากอาเรย์อื่นใน Java?


284

วิธีสร้างอาเรย์ย่อยจากอาเรย์อื่น? มีวิธีการที่ใช้ดัชนีจากอาร์เรย์แรกเช่น:

methodName(object array, int start, int end)

ฉันไม่ต้องการไปทำลูปและทำให้โปรแกรมของฉันประสบ

ฉันได้รับข้อผิดพลาด:

ไม่พบวิธีการใช้สัญลักษณ์ copyOfRange (int [], int, int)

นี่คือรหัสของฉัน:

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

คำตอบ:


305

คุณสามารถใช้ได้

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


3
ฉันมีปัญหาบางอย่างที่ไม่มี Object [] ใน Arrays.copyOfRange ของฉัน ตรวจสอบการนำเข้าของคุณเพื่อให้แน่ใจว่าคุณกำลังใช้ java.util.Arrays เวอร์ชันอาเรย์ที่แตกต่างกันนำเข้ามาและฉันใช้เวลา 15 นาทีในการตรวจสอบ JREs และ JDK สำหรับปัญหา
NuclearPeon

@NuclearPeon ขอบคุณ !!! คงจะใช้เวลาสักพักก่อนที่ฉันจะค้นพบตัวเอง Eclipse org.bouncycastle.util.Arraysนำเข้าโดยอัตโนมัติ
anddero

136

Arrays.copyOfRange(..)ถูกเพิ่มใน Java 1.6 ดังนั้นบางทีคุณอาจไม่มีเวอร์ชันล่าสุด หากไม่สามารถอัพเกรดได้ให้ดูที่System.arraycopy(..)


1
@Sami สามารถอัปเกรดเป็น 1.6 หรือดูเอกสารนี้สำหรับการอ้างอิงdownload.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigar Joshi

4
ผู้ขายรายใดเป็น JDK ของคุณจาก Sun / Oracle ไม่เคยออกรุ่น 4.00.28 และ google ไม่สามารถหาได้
Peter Lawrey

copyOfRange nulls องค์ประกอบต่อท้ายหากพวกเขาอยู่นอกช่วงอาร์เรย์ของแหล่งที่มาแทนการจัดสรรอาร์เรย์ที่มีขนาดเล็ก :(
Daneel S. Yaitskov

12
บางคนควรเพิ่มคำตอบว่าในขณะที่ "start-index" รวมอยู่ด้วย "end-index" เป็นเอกสิทธิ์
Yan King Yin

@ YanKingYin คุณถูกต้อง - นี่เป็นสิ่งที่ฉันอ่านความคิดเห็นใน :) :)
Ben Kushigian


20

ใช่มันเรียกว่าSystem.arraycopy (Object, int, วัตถุ, int, int)

มันจะยังคงทำการวนรอบที่ใดที่หนึ่งยกเว้นว่าสิ่งนี้จะได้รับการปรับให้เหมาะกับสิ่งที่ต้องการREP STOSWโดย JIT (ซึ่งในกรณีนี้การวนซ้ำจะอยู่ภายใน 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

7

การใช้ Apache ArrayUtilsสามารถดาวน์โหลดได้ที่ลิงค์นี้คุณสามารถใช้วิธีการได้ง่าย

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

"boolean" เป็นเพียงตัวอย่างเท่านั้นมีเมธอดสำหรับประเภท java พื้นฐานทั้งหมด


6

JDK> = 1.8

ฉันเห็นด้วยกับคำตอบทั้งหมดข้างต้น นอกจากนี้ยังเป็นวิธีที่ดีกับ Java 8 Streams:

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

ประโยชน์เกี่ยวกับสิ่งนี้คือมันจะมีประโยชน์สำหรับอาเรย์ "src" หลายประเภทและช่วยปรับปรุงการเขียนไปป์ไลน์บนสตรีม

ไม่เฉพาะเจาะจงกับคำถามนี้ แต่ตัวอย่างเช่นหากอาร์เรย์ต้นทางเป็นdouble[]และเราต้องการที่จะใช้average()อาร์เรย์ย่อย:

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();


2

รหัสถูกต้องดังนั้นฉันเดาว่าคุณกำลังใช้ JDK รุ่นเก่ากว่า javadoc สำหรับวิธีการนั้นบอกว่ามันมีมาตั้งแต่ 1.6 ที่ประเภทบรรทัดคำสั่ง:

java -version

ฉันเดาว่าคุณไม่ได้ทำงาน 1.6


1

ฉันใช้จาวาก่อนรุ่น 1.6 ใช้System.arraycopy()แทน หรืออัพเกรดสภาพแวดล้อมของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.