Java에서 배열의 일부만 가져 옵니까?


275

Java에 정수 배열이 있으며 그중 일부만 사용하고 싶습니다. 파이썬에서이 배열 [index :]과 같은 것을 할 수 있고 인덱스에서 배열을 반환합니다. Java에서 이와 같은 것이 가능합니다.

답변:


444

Java에서 배열의 길이는 변경할 수 없습니다. 따라서 원하는 부분을 새 배열로 복사해야합니다. java.util.Arrays 클래스의 메소드를
사용하십시오 .copyOfRange

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

stacktrace 하위 배열에 대한 로컬 var를 만들어야하지만 이것이 작동한다는 것을 알았습니다 !!! Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
— 물병 자리 힘

에주의하십시오 ArrayIndexOutOfBoundsException.
— elias

1
또 다른 문제가 있습니다. 길이가 500K 인 문자열 배열을 250K의 하위 배열로 분할해야하는 경우 어떻게해야합니까? 이 방법은 65000에서 최대 인 interegr를 허용합니다.
— Vishnu Dahatonde

31

배열을 목록으로 감싸서 하위 목록을 요청할 수 있습니다.

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

22

예, Arrays.copyOfRange 를 사용할 수 있습니다

그것은 똑같은 일을합니다 (사본이 있습니다 : 초기 배열을 변경하지 마십시오).


2
즉, 명시적인 사본을 만들고 싶지 않다면 @ K-ballo의 답변에 설명 된대로 a List와 a 를 사용해야합니다 subList.
— Louis Wasserman

맞습니다. Java에는 최신 언어가 제공하는 어레이 슬라이싱 기능이 없습니다.
— Denys Séguret

그런 식으로 넣을지 확실하지 않지만 Java는 배열 슬라이싱을 제공하지 않습니다. (이 방법에는 메모리 누수 가능성 감소, 추가 필드를 피함으로써 어레이 오버 헤드 감소 등의 장점이 있습니다.
— Louis Wasserman

그렇습니다, 당신은 다시 맞습니다 (그리고 나는 화염 전쟁을 시작하지 않았습니다). 슬라이스는 GC를 매우 복잡하게 만듭니다. 그리고 Java가 String에서 객체 기반의 암시 적 슬라이싱을 시도했을 때 이것이 위험하다는 것이 더욱 분명해졌습니다 .
— Denys Séguret 2016 년

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 for System을 참조하십시오 .


3
나는 이것이 정확히 Arrays.copyOf () 및 Arrays.copyOfRange ()가 실제로 구현되는 방법을 좋아하지만 (sounds checks) 약간 더 높은 오버 헤드 유틸리티 메소드 래퍼가 System.arraycopy 데이트에도 불구하고 투표를 쌓는 동안 투표를 얻지 못합니다. 1995 년에 다시
— 데이브

1
나는 그것이 "현대적인"것처럼 보이지 않는 것 같아요.
— Dave

나는 오래된 학교를가는 것을 좋아하고, 종을 울리지 않고 필요한 기계 만 휘파람을 불고 있습니다. C에서 memcpy처럼
— StvnBrkdll

그러나 arrays.copyOfRange ()를 사용하면 가독성이 향상되고 버그 가능성이 크게 줄어 듭니다.
— Florian F

7

Java 1.6 이상을 사용 Arrays.copyOfRange하는 경우 배열의 일부를 복사하는 데 사용할 수 있습니다 . javadoc에서 :

지정된 배열의 지정된 범위를 새 배열로 복사합니다. (from) 범위의 초기 색인은 0과 사이에 있어야 original.length합니다. 의 값 original[from]은 from == original.length또는의 경우가 아니라면 사본의 초기 요소에 배치됩니다 from == to. 원래 배열의 후속 요소 값은 사본의 후속 요소에 배치됩니다. to보다 크거나 같아야 하는 범위 ( ) 의 최종 색인은 보다 클 from수 있으며 original.length,이 경우 false색인이보다 크거나 같은 사본의 모든 요소에 배치됩니다 original.length - from. 반환 된 배열의 길이는입니다 to - 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)방법은 수신하는 두 번째 변수 (var2-1)에서 마이너스 1을 수행합니다. 왜 그런지 정확히 알지 못하지만 그 결과는 어쩌면 배열의 크기를 초과 할 가능성을 줄일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.