2009-08-26 9 views
0

Als zu ändern folgenWas die richtige Art und Weise eine ganze Zahl in einem Vektor in Java (J2ME)

ich jetzt auf meine Frage nach j2me dynamic arrays bis versuchen, einen Weg, um herauszufinden, die Werte der sich ändern Ganzzahlen in meinem Vektor.

Angenommen, ich habe einen Vektor v, und Array arr, und ints x, y und i;

In C++ ich tun konnte:

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

In J2ME der beste Weg, die ich bisher gefunden das gleiche zu tun ist:

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

Ist das wirklich der beste Weg, es J2ME zu tun?

Wenn ja, was ist hier schief gelaufen? Java soll mich dazu bringen, "weniger Arbeit zu machen" und "Dinge für mich zu tun", aber ich finde immer wieder, dass ich dafür extra arbeite. Stimmt etwas nicht mit mir oder ist es ein Problem mit Java?

Edit: Ich verwende die J2me SDK 3.0, die aussieht wie es ist Java 1.3 so keine Phantasie Generika und Auto-Boxen und all das Zeug.

Antwort

4

ich Angst habe, das ist, wie es in mir, obwohl ich d split es zu vermeiden, dass behaarte oneliner:

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

Das Zeug hat sich mit Autoboxing und Generika verbessert, aber es kam in Java 5 und J2ME ist im Grunde eine abgespeckte Version von Java 1.3, es sei denn, ich wurde falsch informiert. Hier ist, wie es aussieht, ist in Java 5+:

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

Noch ausführlicher als C++, aber zumindest ohne das Gießen. Ich verstehe, dass es Zurückhaltung gab, Generika und so zu Java hinzuzufügen, wie es "zu schwer" für den durchschnittlichen Programmierer sein könnte, zu verstehen [Zitat benötigt]. Und so hatten wir am Ende unlesbaren Code, bis .Net Generika bekam und Sun sprang auf den Zug auf.

Anywho, ich stimme zu, dass das Collections-Framework vor generics/boxing zu schaden war, aber ich hoffe zumindest, dass es Ihnen Spaß macht, kaputte Zeiger und beschädigten Speicher zu debuggen.

+0

Generics * ist * selbst für gute Programmierer zu schwer zu verstehen, wenn man sich seine obskuren Interaktionen mit anderen Sprachfunktionen wie Vererbung und Autoboxing anschaut. Aber das ist irrelevant für den täglichen Gebrauch. Natürlich, als Sprachgestalter, ist es das Erste, woran Sie denken, vielleicht ist das eine Erklärung für die Zurückhaltung. –

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

Er verwendet J2ME und es hat keine Generika – Vanya

-2

EDIT: Bei der Beantwortung dieser Frage wusste ich nicht, dass J2ME Generics nicht unterstützt. Danke an SO, dass er mir das beigebracht hat :-)

EDIT 2: Meine Lösung ist falsch seit J2ME Generics nicht unterstützt.

Wenn Sie Generics (ab JDK 1.5) verwendet haben, könnten Sie es einfacher machen!

Wenn ich die Erklärung annehmen, so zu sein,

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

dann

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

wird

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

Diese Frage ist offenbar über J2ME, nicht regelmäßig Java. Guter Punkt tho '. – Esko

+0

Oh! Also unterstützt J2ME Generics nicht? Ich habe das nie gewusst. –

+0

Ja, ich auch nicht; Auch davon überrascht! –

1

Java SE hat einige Änderungen an der Sprache (Generics), die diesen Code ein wenig einfacher machen würde, für mich würde ich vermuten, dass Sie kein Glück haben.

Ich würde für die vorgeschlagene Lösung des Erstellens Ihrer eigenen Klasse gehen, die ein einfaches Array umhüllt (und ein größeres bei Bedarf zuordnet), das als Antwort auf Ihre vorherige Frage gegeben wurde.

0

Ich sehe nicht den Grund, warum Sie es nicht so machen würden, wie Sie in C++ tun. OK, Sie müssen den dynamisch skalierenden Array-Container selbst implementieren, aber wenn Sie dies tun, werden Sie das Integer-Problem los, wo Java tatsächlich einen new Object of type Integer statt int primitiven Typ erstellt.

Ihre ursprüngliche Frage hat ein schönes Beispiel für eine dynamische Int primitive Art Array als Antwort, gehen Sie es erneut aus.

1

Sie haben hier zwei Dinge, die dazu führen, den Code aufzublähen: Fehlen einer typsicheren Sammlung und eines unveränderlichen int-Wrappers.

Eine Lösung wäre die Verwendung einer typsicheren Sammlung. GNU Trove hat TIntArrayList dafür:

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

Alternativ können Sie auch eine veränderliche Klasse wie org.jboss.util.MuInteger verwenden:

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

Oder, wie ein schmutziger Hack, Arrays der Länge 1:

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

Wenn Sie beide kombinieren können (würden Sie definitiv eine benutzerdefinierte Sammlung Klasse in Abwesenheit von Generika schreiben):

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