2013-07-01 27 views
5

我正在寫一個函數來在Java中求和兩個數組(不一定等於大小)並返回結果。如何在Java中求和數組

這裏是我的嘗試:

public static <T> T[] sumArrays(T[] lhs, T[] rhs) 
    { 
     T[] out = new T[Math.max(lhs.length, rhs.length)]; 

     for (int i = 0; i < Math.max(lhs.length, rhs.length); ++i){    
      if (i < Math.min(lhs.length, rhs.length)){ 
       out[i] = lhs[i] + rhs[i];     
      } else if (i < lhs.length){ 
       out[i] = lhs[i]; 
      } else /* if (i < rhs.length)*/{ 
       out[i] = rhs[i]; 
      }    
     } 
     return out;   
    } 

但我有一些看法,儘管編譯錯誤。

  1. 爲什麼Java函數庫中沒有這個函數,這在極端情況下是巨大的?

  2. 我的動機是使用泛型,因爲您會在C++中使用模板。

  3. 我很擔心獲取輸入數據的深層副本; lhs和``rhs。任何人都可以向我保證? C++允許我傳遞一個常量引用;我肯定知道。

  4. 例示T[] out對於泛型類型似乎是非法的。我錯過了什麼?

  5. 編譯器會優化我的重複Math.max(lhs.length, rhs.length)嗎?編程器不喜歡lhs[i] + rhs[i]。大概是因爲它不知道T的類型,但是C++允許你這樣做,因爲在知道類型之前它不會嘗試編譯模板。

6)返回時是否需要進行深層複製?同樣,C++編譯器也不會獲得額外的副本。

也許我太老了習慣的Java ;-)

+0

廣告3)http://javadude.com/articles/passbyvalue.htm –

+0

添加兩個不均勻長度數組的內容並不是一個普通的活動,我從來沒有做過。如果是這樣的話,那麼分開兩個數組,減去兩個數組,從一個數組增加一個數組到另一個數組的等等等等等等等等。Java給你工具來做它,如果你需要的話 –

+1

'T'在運行時是未知的這就是爲什麼你不能做'new T []' – blank

回答

8

0)爲什麼沒有這個功能極其巨大的Java庫?

詢問意見,在這裏脫離主題。

2)我很擔心獲取輸入數據的深層副本; lhs和rhs。任何人都可以向我保證? C++允許我傳遞一個常量引用;我肯定知道。

6)返回時是否需要進行深層複製?同樣,C++編譯器也不會獲得額外的副本。

不深複製曾經在Java中自動完成。而且,深層複製通常是一個不明確的問題。

3)例示T[] out對於泛型類型似乎是非法的。我錯過了什麼?

除了不可能實例化泛型類型數組外,泛型類型只涵蓋引用類型。你說的很可能只是在這裏基本類型有興趣,所以他們是沒有用的。

4)請問編譯器是否優化了我的重複Math.max(lhs.length, rhs.length)

一些JIT可能,但你不能有任何形式的保證。提取到一個局部變量。

5)編譯器不喜歡lhs[i] + rhs[i]。大概是因爲它不知道T的類型,但是C++允許你這樣做,因爲在知道類型之前它不會嘗試編譯模板。

不幸的是,您在這裏遇到了很多麻煩。沒有辦法爲所有原始Java類型生成算法。

+0

嗡嗡聲,但+1。這不能被視爲一種批評,因爲Java在考慮如何改進其他語言方面欠其優雅,但上述內容在C++中使用模板很容易實現。我想我應該建立一個使用雙替代T的版本。 – Bathsheba

+0

@Bathsheba在C++中,如果您嘗試(例如)添加籃球來阻止籃球,會發生什麼?正如您所寫的,您的代碼允許這樣做(如果編譯器不反對) –

+2

C++模板在編譯時使用特定類型實例化,因此它們與Java Generics無關。是的,JG是Java的一個非常柔弱的特性,具有可怕的推重比,並且已經受到了很多批評。 –

1

5)編譯器不喜歡lhs [i] + rhs [i]。大概是因爲它 不知道T的類型,但C++允許你這樣做,因爲 在知道類型之前不會嘗試編譯模板。

您可以隨時使用.add(...)函數編寫接口,並讓T擴展此接口。然後你可以編寫lhs [i] .add(rhs [i])