2013-01-23 16 views
2

我正在嘗試編寫賦值賦予的一些僞代碼 - 但是現在我正在執行的代碼部分不是賦值的一部分,只是爲了好玩。通過創建一種方法來簡化Java代碼......但是在哪裏?

僞代碼的一部分表示「交換數組元素」。在我的代碼中,我必須在兩個地方做到這一點。然而,我想知道是否有辦法通過創建一個方法來實現這一點,即創建另一個方法,只需交換它們,並保存每次我想運行它時使用的額外代碼行。

問題是,如果我在這個之外創建了一個全新的方法,那麼我將不得不發送數組作爲參數,並且將其作爲參數發送出去,而且我恐怕效率會降低(這裏顯然沒有什麼大不了的,但我正在努力學習未來更大的項目)。

這是我的代碼,包含重複的「交換」方法行。

public int[] myAlgorithm(int[] arrayOfInts, int size){ 
    boolean done = true; 
    int j= 0; 

    while (j <= n-2){ 
     if (arrayOfInts[j] > arrayOfInts[j+1]){ 
      int tempHolder = arrayOfInts[j]; 
      arrayOfInts[j] = arrayOfInts[j+1]; 
      arrayOfInts[j+1] = tempHolder; 
      done = false; 
     } 
     j = j + 1; 
    } 
    j = size - 1; 
    while (j >= 1){ 
     if (arrayOfInts[j] <= arrayOfInts[j-1]){ 
      int tempHolder = arrayOfInts[j]; 
      arrayOfInts[j] = arrayOfInts[j+1]; 
      arrayOfInts[j+1] = tempHolder; 
      done = false; 
     } 
     j--; 
    } 
    if (!done) 
     myAlgorithm(arrayOfInts, size) 
    else 
     return arrayOfInts; 
} 
+0

http://stackoverflow.com/questions/1363186/is-it-possible-to-write-swap-method-in-java –

回答

3

我將有數組中發送作爲參數,並把它拿出來,以及

你只需要在陣列上直接「發送」和工作。實際上,將一個參數傳遞給方法是一個非常便宜的操作,如果經常調用的話,它可能會被編譯器優化,所以您不應該擔心它太多(除非通過性能分析證明它是性能損失你的申請)。

在你的情況,你可以有一個方法,如:

public void swap(int[] arrayOfInts, int i, int j) { 
    int tempHolder = arrayOfInts[i]; 
    arrayOfInts[i] = arrayOfInts[j]; 
    arrayOfInts[j] = tempHolder; 
} 

,你會稱它爲:

swap(arrayOfInts, j, j+1); 

爲什麼它的工作?

Java passes arguments by value,但是在對象(即非基元類型,包括數組)的情況下,傳遞的值是對該對象的引用。換句話說,swap方法的參數是與調用代碼中相同的數組的引用,所以您可以直接在該數組上進行操作,而無需將其發送回調用方法。

+0

感謝您的明確解釋! – CodyBugstein

1

如果有重複的代碼位,則需要較少的時間運行。它需要更多的空間。

問題是,你無法預測編譯器如何優化你的代碼。你可以創建一個接受數組和兩個索引的函數,並在這些索引處交換元素。編譯器可能會在您調用它的函數中內聯代碼。如果你不這樣做,編譯器可能會注意到你有重複的代碼,並且如果它決定創建一個函數。

編寫代碼如何最好地讀取它,特別是當效率差異如此之小時。

1

的問題是,如果我創建了一個全新的方法,這一次之外,我會在數組中發送作爲參數,並把它拿出來,以及...

這實際上並非如此。在Java中,數組是一個對象。所以,當你將一個數組傳遞給一個方法時,你實際上只傳遞一個對數組的引用。在方法調用之後,對方法內的數組所做的任何更改都會在那裏。僅將參考傳遞給數組也意味着該方法將非常快速,因爲您並未製作整個數組的副本。

所以可以編寫一個交換方法:

private void swap(int[] arrayOfInts, int i, int j) { 
    int temp = arrayOfInts[i]; 
    arrayOfInts[i] = arrayOfInts[j]; 
    arrayOfInts[j] = temp; 
} 
1

陣列,相同的參考類型的任何其他目的通過引用傳遞 - 即,參考對象是由值來傳遞。這意味着,數組本身不被複制。因此,沒有什麼共鳴會害怕「效率較低」。

1

在java中,你可以傳遞數組作爲變量,這隻會傳遞一個指針而不是整個數組的新副本,所以你必須傳遞數組和你想要交換的兩個索引:

public static void swap(final int[] arr, final int   pos1, final int pos2){ 
final int temp = arr[pos1]; 
arr[pos1] = arr[pos2]; 
arr[pos2] = temp; 
} 
相關問題