2009-08-26 61 views
0

作爲後續行動,以我的問題有關j2me dynamic arrays什麼是Java(J2ME)改變的整數。在矢量正確的方式

現在我試圖找出一種方法來改變的值整數在我的矢量。假設我有一個向量v和數組arr,並且輸入x,y和i;

在C++中我可以這樣做:

v[arr[x][y]] += i; 

在J2ME中,我發現迄今做同樣的最好的辦法是:

v.setElementAt(new Integer(((Integer)(v.elementAt(arr[x][y]))).intValue()+i), arr[x][y]); 

這真的是做J2ME的最好方法是什麼?

如果是這樣,這裏出了什麼問題? Java應該讓我「做更少的工作」和「爲我做事」,但我卻一次又一次地爲它做了額外的工作。我有什麼問題,或者是Java的問題?

編輯:我使用的是J2me SDK 3.0,它看起來像Java 1.3,所以沒有花哨的泛型和自動裝箱以及所有這些東西。

回答

4

恐怕這就是它在我裏面,雖然我d分開以避免多毛線:

Integer val = (Integer)v.elementAt(arr[x][y]); 
int newVal = val.intValue() + i; 
v.setElementAt(new Integer(newVal), arr[x][y]); 

這些東西在自動裝箱和泛型方面有了很大的改進,但是它們都是用Java 5編寫的,J2ME基本上是Java 1.3的精簡版本,除非我誤會了。以下是它在Java 5+中的外觀:

v.setElementAt(arr[x][y], v.get(arr[x][y]) + i); 

還比C++更詳細,但至少沒有強制轉換。據我所知,不願意爲Java添加泛型等,因爲普通程序員可能會「難以理解」[引文需要]。因此,我們最終得到了無法讀取的代碼,直到.Net獲得了泛型並且Sun跳上了這一行列。

任何人,我同意集合框架是在泛型/裝箱之前使用的一種痛苦,但我希望至少你會喜歡不必調試破損的指針和損壞的內存。

+0

即使對於優秀的程序員來說,泛型*也很難理解,如果你看看它與繼承和自動裝配等其他語言特性的更隱蔽的交互。但這對於大多數日常使用來說是無關緊要的。當然,作爲語言設計師,這是你首先想到的,所以也許這是對不情願的解釋。 – 2009-08-26 10:31:28

-2
Vector<Integer> v = new Vector<Integer>(); 
v.setElementAt(arr[x][y], arr[x][y]); 
+0

他使用J2ME,它沒有泛型 – Vanya 2009-08-26 10:15:32

-2

編輯:在回答這個問題時,我不知道J2ME不支持泛型。感謝SO教給我:-)

編輯2:我的解決方案是錯誤,因爲J2ME不支持泛型。

如果您使用過泛型(JDK 1.5以上版本),則可以更簡單一些!

如果我假設的聲明是這樣,

Vector<Integer> v = new Vector<Integer>(); 

然後

v.setElementAt(new Integer(((Integer)(v.elementAt(arr[x][y]))).intValue()+i), arr[x][y]); 

成爲

v.setElementAt(new Integer(v.elementAt(arr[x][y]).intValue()+i), arr[x][y]); 
+0

這個問題顯然是關於J2ME,而不是普通的Java。好點的'。 – Esko 2009-08-26 10:12:21

+0

哦!那麼J2ME不支持泛型?從來不知道。 – 2009-08-26 10:16:02

+0

是的,我也是;也很驚訝! – 2009-08-26 10:33:44

1

Java SE對語言(泛型)進行了一些更改,這會使代碼變得更簡單一些,因爲我猜測你運氣不好。

我會爲建議的解決方案創建自己的包裝普通數組的類(並在需要時分配一個更大的數組),並將其作爲上一個問題的答案。

0

我看不出你爲什麼不像你在C++中那樣做這件事的原因。好的,您必須自己實現動態擴展數組容器,但如果這樣做,則可以擺脫整數問題,其中Java實際上創建了new Object of type Integer而不是int基本類型。

你原來的問題有一個動態int基元類型數組作爲答案的好例子,請再次檢查。

1

在這裏有兩件事情是陰謀膨脹的代碼:缺乏類型安全集合,和不可變的int包裝。

一個解決方案是使用類型安全集合。 GNU特羅韋有此TIntArrayList

v.set(arr[x][y], v.get(arr[x][y]) + i); 

或者,你可以使用一個可變類像org.jboss.util.MuInteger

((int[])v.elementAt(arr[x][y]))[0] += i; 

((MuInteger)v.elementAt(arr[x][y])).add(i); 

,或作爲骯髒的黑客,長度爲1的陣列

如果你可以將兩者結合起來(肯定會要求你寫一個自定義集合類,在沒有泛型的情況下):

v.get(arr[x][y]).add(i); 
相關問題