作为关于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所以没有花哨的泛型和自动拳击以及所有这些东西。
答案 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)
编辑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]);