2013-06-19 2 views
0

for 루프를 개선하기 시작했습니다. 이 루프를 사용하여 배열을 복사 할 수 있는지 알고 싶습니다. 특정 배열의 모든 요소를 ​​반복하여 새 배열에 복사하려고합니다. 또한 향상된 for-loop를 사용하여 일반적인 for 루프 대신 새 배열을 인스턴스화하는 것이 좋습니다. 현재 구현에서는 어레이가 얼마나 큰지 알고 있지만 나중에 참조 할 수 있는지 여부와 그럴 수 있는지 알고 싶습니다.향상된 for 루프를 사용하여 배열을 복사하는 방법이 있습니까?

내가하는 일에 대한 구체적인 계획은 내 질문에 대한 답변에 도움이 될 수 있습니다. 내가하고있는 일은 텍스트 파일에서 텍스트 줄을 검색 한 다음 해당 문자열에 split (",")을 호출하는 것입니다. 문자열 배열을 반환합니다. 이 배열을 메모리에 저장하여 나중에 재생할 수 있습니다.

향상된 for 루프가 작동하는 것을 이해하는 방법은 첫 번째 값에 배열의 현재 위치가 할당되고 두 번째 값이 통과 될 배열입니다.

for-loops에 대한 다른 형식이 있는지 궁금 해서요 : for (초기화, 종료, 반복) 및 for (Object o : list []).

+3

왜 정기적 인 for-loop를 사용하지 않으시겠습니까? 배열 복사 [System.arraycopy] (http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy%28java.lang.Object,%20int,%20java. lang.Object, % 20int, % 20int % 29)이 유용 할 수 있습니다. – MAV

+0

"... for : (초기화, 종료, 반복)'및 for (Object o : list [])'또한 for (T o : Iterable )와 같은 목록이 인스턴스 http : // ideone.com/EsbJop – Pshemo

답변

2

내 지식에 따라 표준 for(init; termination; iterataion) 개의 루프와 각 for(type o : iterable) 개의 루프 만 있습니다.

먼저 크기를 아는 것이 중요하지 않아야합니다. 새 배열을 인스턴스화하려면 원래 배열의 .length 필드 인 new String[original.length];을 아래와 같이 사용합니다.

  1. 당신은 더 그것을 만들기위한-각각 두 루프를 반복하기 위해 루프, 중첩이 필요합니다 :

    을 따라 이동하면 당신이 무엇을하고 있는지에 대한 루프에 대한 표준은 두 가지 이유로 적절하다 루프에 대한 표준보다 번거 롭다. 원시적 인 데이터 형식 또는 문자열의 경우에 더 중요한 피 각 루프에서 : 전에 선언 변수

  2. 를 (또는 blalasaadri의 솔루션에서와 같이 외부에서 정의 된 카운터를 추가)를 의를 나타낸다 각 연속적인 요소는 이 아니며 실제 요소에 대한 참조는입니다. 따라서 루프가 반복되면 변수에 대한 모든 변경 사항이 사라집니다. 나는 이것을 알아 내고 싶지만 시도하지 않았기 때문에 이것이 '정상적인'객체 (즉, String이 아닌)를 유지하는지 확신 할 수 없다.

    을 설명하기 : SARR위한

    String[] sArr = {"foobar"}; 
    String s = sArr[0]; 
    s = "openbar"; 
    

    안타깝게도 [0], 열려있는 바, 예전는 foobar 없다 :

    String[] sArr = {"foobar"}; 
    for(String s : sArr){ 
        s = "openbar"; 
    } 
    

    는 동등하다. 솔루션으로

, 당신은 import java.util.Arrays;은 시도 할 수있는 경우 : 당신이 롤백해야하는 경우,

String[] copyStrings = Arrays.copyOf(arrStrings, arrStrings.length); 

을하거나 자신 :

public String[] copyArray(String[] original){ 
    String[] dupe = new String[original.length]; //I assume you want equal length 
    for(int i = 0; i < original.length; i++){ 
     dupe[i] = original[i]; //single iterator traverses both arrays 
    } 
    return dupe; 
} 
+1

문자열 배열 sArr을 "foobar"값으로 인스턴스화하는 예제를 제공하면 첫 번째 예제의 for 루프에있는 두 번째 매개 변수가 사용자가 만든 배열 (sArr)이어야합니까? 그 for-loop의 몸체가 "openbar"라는 값을 할당한다는 것을 의미합니까? – OKGimmeMoney

+0

그래, 맞아. 지금 고쳐 놨어. 그런데 실수로 IDE에 의존해서 그게 나에 관한거야 – Grim0013

+0

"openbar"가 맞습니까? – OKGimmeMoney

3

당신이 향상된로 유지하려면 배열을 복사하기위한 for 루프에는 개선 된 for 루프에 카운터가 없다는 문제가 있습니다. 그러나 배열에 요소를 삽입하려면 카운터가 필요합니다.그래서 수동으로 그렇게 할 수 있습니다 :

String[] array = {"A", "Bb", "c", "dD"}; 
String[] newArray = new String[array.length]; 

int i=0; 
for(String stuff : array) { 
    newArray[i++] = stuff; 
} 

이것은 완전히 가능하지만 향상된 for 루프 뒤에 있습니다.

의도에 맞춰 더는 다음과 같이 될 것이다 :

String[] array = {"A", "Bb", "c", "dD"}; 
List<String> list = new ArrayList<String>(); 

for(String stuff : array) { 
    list.add(stuff); 
} 

String[] newArray = new String[list.size()]; 
list.toArray(newArray); 

그 방법뿐만 아니라 당신은 루프 향상된, 당신은 또한 array.length() != newArray.length()가 (때문에 말할 수있는 가능성을 허용 뒤에 생각을 따르는가 , 배열 필터링).

편집 : Java 7부터 언급 한 두 개의 루프 만 있습니다. 이것은 현명한 것으로 보이지만 이후 버전에서는 변경 될 수 있습니다. 결국 개선 된 for 루프는 Java 5에서만 추가되었습니다 (here 참조).

0
// copy contents of Object[] arr1 into Object[] arr2 
arr2 = new int[arr1.length]; 
int i=0; 
for(Object c:arr1){ //store an element of arr1 in c iteratively 
    arr2[i] = c; 
    i++; 
} 
관련 문제