เป็นเพียงส่วนหนึ่งของอาร์เรย์ใน Java?


275

ฉันมีจำนวนเต็มจำนวนเต็มใน Java ฉันต้องการใช้เพียงบางส่วนเท่านั้น ฉันรู้ใน Python คุณสามารถทำอะไรเช่น array [index:] และมันคืนค่า array จาก index สิ่งนี้เป็นไปได้ใน Java

คำตอบ:


444

ความยาวของอาร์เรย์ใน Java นั้นไม่เปลี่ยนรูป ดังนั้นคุณต้องคัดลอกส่วนที่ต้องการเป็นอาร์เรย์ใหม่
ใช้copyOfRangeวิธีการจากคลาสjava.util.Arrays :

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

startIndexเป็นดัชนีเริ่มต้นของช่วงที่จะคัดลอกรวม
endIndexเป็นดัชนีสุดท้ายของช่วงที่จะคัดลอกแบบเอกสิทธิ์ (ดัชนีนี้อาจอยู่นอกอาร์เรย์)

เช่น:

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

ดูเหมือนว่าจะมีการ จำกัด ขนาดหรือไม่ ใช้งานได้เฉพาะ: Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,255)แทน 255 ฉันไม่สามารถใช้ Integer.MAX_VALUE ได้ในกรณีที่ฉันไม่ต้องการรับความยาวจริง
Aquarius Power

@AquariusPower ขนาดที่ จำกัด คือขนาดของอาเรย์และสามารถมากกว่า 255 ได้คุณไม่สามารถระบุendIndexขนาดที่ใหญ่กว่าของอาเรย์ที่ถูกส่งเป็นอาร์กิวเมนต์แรก ดังนั้นหากคุณต้องการสำเนาเต็มให้สร้างตัวแปรที่อ้างถึงอาร์เรย์นี้และใช้Arrays.copyOfRange(var, 0, var.length)หรือArrays.copyOf(var, var.length)
elias

ฉันจะต้องสร้าง var ท้องถิ่นสำหรับสแต็คย่อย stacktrace แต่ฉันพบว่ามันใช้งานได้ !!! Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
กุมภ์กุมอำนาจ

ระวังตัวArrayIndexOutOfBoundsExceptionด้วย
elias

1
มีปัญหาอื่น จะทำอย่างไรถ้าฉันต้องการแยกสตริงความยาวบอก 500K เป็น subarrays 250K วิธีการเหล่านี้ยอมรับ interegr ซึ่งสูงสุดที่ 65000
Vishnu Dahatonde

31

คุณสามารถล้อมอาร์เรย์เป็นรายการและขอรายการย่อยของมัน

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

22

ใช่คุณสามารถใช้Arrays.copyOfRange

มันทำในสิ่งเดียวกัน (หมายเหตุมีสำเนา: คุณไม่เปลี่ยนอาร์เรย์เริ่มต้น)


2
หากคุณไม่ต้องการทำสำเนาอย่างชัดเจนคุณจะต้องใช้ a Listและ a subListตามที่ระบุไว้ในคำตอบของ @ K-ballo
Louis Wasserman

ถูกตัอง. Java ไม่มีเครื่องมือแบ่งส่วนข้อมูลที่มีภาษาที่ทันสมัยกว่า
Denys Séguret

ฉันไม่แน่ใจว่าฉันจะทำอย่างนั้น แต่ ... ใช่แล้ว Java ไม่ได้เสนอการแบ่งอาร์เรย์ (ที่กล่าวว่ามีข้อดีบางประการสำหรับวิธีนี้: ลดความเป็นไปได้สำหรับการรั่วไหลของหน่วยความจำลดค่าใช้จ่ายของอาร์เรย์โดยหลีกเลี่ยงฟิลด์พิเศษ ฯลฯ คุณสามารถไปทางใดทางหนึ่ง)
Louis Wasserman

ใช่คุณพูดถูกอีกครั้ง (และฉันไม่ได้พยายามที่จะเริ่มสงครามไฟ;)) การแบ่งส่วนทำให้ GC ซับซ้อนมาก และเมื่อได้ลอง Java วัตถุตามหั่นนัยใน Strings มันทำให้มันชัดเจนมากขึ้นว่าเรื่องนี้เป็นอันตราย
Denys Séguret

11

คุณสามารถลอง:

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

ดูJavadoc ระบบ


3
ฉันรักวิธีนี้เป็นวิธี Arrays.copyOf () และ Arrays.copyOfRange () จริง ๆ แล้วจะดำเนินการ (ตรวจสอบ sans bounds) และยังไม่ได้รับการโหวตในขณะที่วิธียูทิลิตี้ค่าใช้จ่ายสูงกว่าเล็กน้อยห่อขึ้นคะแนนแม้จะ System.arraycopy กลับไปที่ 1995
เดฟ

1
ฉันคิดว่ามันดูไม่ทันสมัยเท่าที่ควร
เดฟ

ฉันชอบไปโรงเรียนเก่าไม่มีเสียงระฆังและเสียงหวีดหวิวเพียงเครื่องจักรที่จำเป็น เช่น memcpy ใน C
StvnBrkdll

แต่การใช้ arrays.copyOfRange () จะเพิ่มความสามารถในการอ่านและลดความเป็นไปได้ของข้อบกพร่อง
Florian F

7

หากคุณใช้ Java 1.6 หรือสูงกว่าคุณสามารถใช้Arrays.copyOfRangeเพื่อคัดลอกส่วนของอาร์เรย์ จาก javadoc:

คัดลอกช่วงที่ระบุของอาร์เรย์ที่ระบุลงในอาร์เรย์ใหม่ ดัชนีเริ่มต้นของช่วง (จาก) จะต้องอยู่ระหว่างศูนย์ถึงและoriginal.lengthรวม ค่าที่original[from]ถูกวางไว้ในองค์ประกอบเริ่มต้นของการคัดลอก (เว้นแต่from == original.lengthหรือfrom == to) ค่าจากองค์ประกอบที่ตามมาในอาร์เรย์เดิมจะถูกวางไว้ในองค์ประกอบที่ตามมาในการคัดลอก ดัชนีสุดท้ายของช่วง ( to) ซึ่งต้องมีค่ามากกว่าหรือเท่ากับfromอาจจะมากกว่าoriginal.lengthซึ่งในกรณีนี้จะถูกวางในทุกองค์ประกอบของการคัดลอกซึ่งดัชนีมีค่ามากกว่าหรือเท่ากับfalse ความยาวของอาร์เรย์กลับจะเป็นoriginal.length - fromto - from

นี่คือตัวอย่างง่ายๆ :

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

}



-2

คุณสามารถใช้subList(int fromIndex, int toIndex)วิธีการในจำนวนเต็ม arr ของคุณเช่นนี้:

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

ผลลัพธ์จะเป็น: 2 3.

โปรดทราบว่าsubList(int fromIndex, int toIndex)วิธีการทำงานลบ 1 ในตัวแปรที่ 2 ที่ได้รับ (var2 - 1) ฉันไม่ทราบว่าทำไม แต่นั่นคือสิ่งที่เกิดขึ้นอาจจะลดโอกาสของการเกินขนาดของอาร์เรย์

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