2010-12-12 32 views
0

我對java很陌生,只有一門課,並且正在尋找更有效的方法來做事。簡單的Java問題:「Subarrays」和「refressing」分配的變量;

A.是否存在子陣列?我想分配給一個新的數組,另一個數組範圍內的元素。

我被教導的唯一方法是:

int[] a = {a, b, c, d}; 
int[] b = {a[0], a[1]}; 

有什麼類似variable.substring(停止,結束)?

B.這一個很難解釋。如果我有兩個變量,a和b,其中b = a + 1(例如),並且我更改了a,我必須重新指定b = a + 1,否則b將等於我更改a之前的所有變量。有沒有辦法使用a的新值「刷新」b,而不必每次都輸入b = a + 1(或更復雜的東西)?

這是少功能和質量更多。

回答

3

答:不,沒有子陣列。您可以使用System.arraycopy將一個陣列的部分或全部複製到另一個陣列。

除了數組,您可以使用列表,特別是ArrayListList.subList會給你一個「視圖」到原始列表的一部分。 (作爲一種觀點,這意味着如果原始列表被修改,則子列表也將被修改,反之亦然)。

B.否。對於這種情況而不是單獨的變量b,最好有一個方法來計算b的值。然後,當你想知道b的值時,你可以調用該方法。如果你想變得很花哨,你甚至可以引入某種緩存,但這是一種優化(如果/當你實際測量性能問題,最好留下)。

+1

+1 - 重新部分B:在建模方面(例如使用UML,MOF,EMF術語),'b'將被描述爲「派生屬性」。但是你是對的:Java沒有提供任何特定的支持,你需要將它作爲一種方法來實現。 – 2010-12-13 01:02:02

1

A)做單一操作的唯一方法是使用ArrayList。否則你做的很好。

B)要更新值,您需要執行分配。如果你希望這種情況發生,你可以用Observer/Observable模式來實現,但是你仍然需要實現這一點,它不會比簡單的代碼行更簡單。

1

這一個很難解釋。

您似乎尋找的術語是「值語義」和「引用語義」。在Java中,基元(int,char,double等類型的值)具有值語義:變量存儲實際值,所以b = a複製該值,並且a += 1增加該值,而不影響任何其他變量恰好保持相同的價值。然而,對象(類是一個類的實例的值)具有引用語義:變量實際上只是「標記」該值(存儲某種類型的引用),所以b = a給變量賦予了相同的名稱,並且更改了a(你不能在Java中重載操作符,所以我們不能在這種情況下編譯a += 1)也會改變b,因爲它們實際上是一樣的。 (雖然這仍然不會有什麼影響,當然,上碰巧是「平等」的任何其他對象 - 不管這實際上意味着該類型)

Java那樣提供對象稱爲IntegerCharDouble等。它們具有引用語義並鏡像原始類型。然而,他們是不可變的(即不能改變),所以他們不解決這個「問題」。

此外,這些都不會自動保持兩個不同的值彼此「同步」(即通過一些數學函數相關)。如果你想b始終等於a + 1(或者一般來說,比這更復雜的事情),不管a發生了什麼,那麼你必須自己確定它。有許多方法可以做到這一點,具有不同的複雜性,並且工作的正確工具取決於各種因素。但你應該首先考慮你是否真的想保持b左右。有一個很好的機會,你真正應該做的只是寫一個函數b()計算並返回a + 1(或者,再次,無論實際關係是什麼)。