2013-06-19 64 views
0

我剛開始使用增強for循環。我想知道我是否可以使用此循環來複制數組。我想遍歷某個數組中的每個元素並將其複製到一個新數組中。使用增強型for循環來實例化我的新數組(而不是典型的for循環)也是很好的。在我目前的實現中,我確實知道我想要這個數組有多大,但是爲了將來的參考,我想知道我是否可以這樣做,如果可以,怎麼做。有沒有辦法使用增強for循環來複制數組?

我對我所做的具體計劃可能有助於回答我的問題。我正在做的是從文本文件中檢索一行文本,然後對該字符串調用split(「,」) - 這將返回一個字符串數組。我想將這個數組存儲在內存中,以便以後可以使用它。

我理解增強型for-loop工作的方式是,第一個值分配給數組中的當前位置,第二個值是要遍歷的數組。

我想知道除了:for(initialization; termination; iterate)和for(Object o:list [])之外是否還有for-loops的其他格式。

+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(initialization; termination; iterate)'和'for(Object o:list [])'還有'for(To:Iterable )'like Lists for example http:// ideone.com/EsbJop – Pshemo

回答

2

據我所知,只有標準for(init; termination; iterataion)循環和每個for(type o : iterable)循環。

首先,提前知道尺寸不應該成爲問題。要實例化新數組,請使用原始數組的.length字段:new String[original.length];,如下所示。

一起移動,因爲你在做什麼,for循環的標準是適當的,原因有二:

  1. 您需要嵌套二爲,各以迭代都 循環圈,使之更麻煩比循環的標準。 (或添加一個外部定義的計數器,如在blalasaadri的溶液)
  2. 更重要的是,在一個基本數據類型或者一字符串的情況下,在for-each循環的:之前聲明的變量表示的每個連續的元素,並且不是對實際元素的參考。因此,一旦循環迭代,對變量的任何更改都會消失。我不確定這是否適用於'普通'對象(即:不是字符串),因爲我還沒有嘗試過,儘管我現在想知道。

    爲了說明:

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

    是等價的:

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

    不幸的是,對於SARR [0],沒有公開欄,同樣的老foobar的。

至於解決辦法,如果你能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

當你舉例說明你在使用值「foobar」實例化字符串數組sArr時。第一個例子for循環中的第二個參數應該是你創建的數組(sArr)嗎?另外,在這個for循環的主體是否意味着賦值'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); 

這樣你不僅跟在別人後面增強的for循環,也允許可能性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++; 
} 
相關問題