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.