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)

자바 독

JDK <= 1.5

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

자바 독


3
Arrays.copyOfRange에 Object []가없는 데 문제가있었습니다. 가져 오기를 점검하여 java.util.Arrays를 사용하고 있는지 확인하십시오. 어떻게 든 다른 어레이 버전을 가져 왔고 15 분 동안 JRE 및 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 조시

4
JDK는 어느 공급 업체입니까? Sun / Oracle은 4.00.28 버전을 출시하지 않았으며 Google도 찾을 수 없었습니다.
Peter Lawrey

copyOfRange는 더 작은 배열을 할당하는 대신 소스 배열 범위를 벗어난 경우 후행 요소를 널 (null)로
만듭니다.

12
누군가가 "시작 인덱스"를 포함하는 동안, "최종 지수"라는 대답에 추가해야 독점
연의 왕 음과

@YanKingYin 당신은 정확합니다-이것은 정확하게 내가 다음에 대한 의견을 읽고있는 것입니다 :)
Ben Kushigian



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

3
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);

2

코드가 정확하므로 이전 JDK를 사용하고 있다고 생각합니다. 해당 메소드에 대한 javadoc은 1.6 이후로 존재한다고 말합니다. 명령 행에 다음을 입력하십시오.

java -version

나는 당신이 1.6을 실행하지 않는 것 같아요


1

1.6 버전 이전에 java를 사용 System.arraycopy()하고 있습니다. 또는 환경을 업그레이드하십시오.

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