在Java中更改Vector中的Integer的正确方法是什么(j2me)

时间:2009-08-26 09:55:20

标签: java arrays java-me

作为关于j2me dynamic arrays的问题的跟进,

我现在正试图找出一种方法来改变我的Vector中的整数值。

假设我有一个Vector v和Array 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]);

这真的是最好的方式来做到这一点吗?

如果是的话,这里出了什么问题? Java应该让我“做更少的工作”和“为我做事”,但我发现自己一次又一次地为它做额外的工作。我有什么问题,或者Java有问题吗?

编辑:我正在使用看起来像是Java 1.3的J2me SDK 3.0所以没有花哨的泛型和自动拳击以及所有这些东西。

6 个答案:

答案 0 :(得分:4)

我担心它是如何在我身上,虽然我将它分开以避免那个毛茸茸的oneliner:

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

使用autoboxing和泛型,东西得到了很好的改进,但它们来自Java 5,而J2ME基本上是Java 1.3的剥离版本,除非我被误导。以下是它在Java 5 +中的外观:

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

比C ++更冗长,但至少没有强制转换。我知道不愿意在Java中添加泛型等,因为对于普通程序员来说理解 [Citation needed] 可能“太难”了。所以我们最终得到了难以理解的代码,直到.Net获得了泛型,而Sun也加入了这个行列。

Anywho,我同意收藏框架在使用仿制品/拳击之前很难用,但我希望至少你不必调试破碎的指针和损坏的内存。

答案 1 :(得分:1)

Java SE对语言进行了一些更改(Generics),这会使这段代码变得更简单,对我来说,我觉得你运气不好。

我会寻求建议你创建自己的类的解决方案,该类包装一个普通数组(并在需要时分配一个更大的数组),作为你上一个问题的答案。

答案 2 :(得分:1)

这里有两件事情是密谋破解代码:缺少类型安全集合和不可变的int包装器。

一种解决方案是使用类型安全集合。 GNU Trove为此TIntArrayList

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

或者,您可以使用像org.jboss.util.MuInteger这样的可变类:

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

或者,作为一个肮脏的黑客,长度为1的数组:

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

如果你可以将两者结合起来(肯定会要求你写一个自定义集合类,在没有泛型的情况下):

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

答案 3 :(得分:0)

我没有看到你不会像在C ++中那样做的原因。好的,您必须自己实现动态扩展数组容器,但如果这样做,则可以解决Java实际创建new Object of type Integer而不是int原始类型的整数问题。

您的原始问题有一个很好的动态int基元类型数组示例作为答案,请再次检查。

答案 4 :(得分:-2)

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

答案 5 :(得分:-2)

编辑:在回答这个问题时,我不知道J2ME不支持Generics。感谢SO教我: - )

编辑2:我的解决方案是错误,因为J2ME不支持泛型。

如果您使用过Generics(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]);