that
Hoffnungsloser Optimist
|
Kann mir mal bitte jemand folgendes kleine C++ Beispiel in Java (1.3 oder 1.4) übersetzen? Ich kann nämlich nicht ganz glauben, dass es in Java nicht gehen soll, eine Map von "int" auf "String" zu machen. #include <string>
#include <map>
#include <iostream>
using namespace std;
int main()
{
map<int, string> mymap;
mymap[1] = "eins";
mymap[8] = "acht";
mymap[3] = "drei";
mymap[10] = "zehn";
mymap[100] = "hundert";
map<int, string> map2 = mymap;
for (map<int, string>::iterator it = map2.begin(); it != map2.end(); ++it)
cout << it->first << " -> " << it->second << endl;
return 0;
}
Bearbeitet von that am 16.12.2004, 00:34
|
murcielago
Dr. Doom
|
import java.util.HashMap;
import java.util.Set;
import java.util.Iterator;
public static void main(String [] args) {
HashMap myMap = new HashMap();
myMap.put(new Integer(1), "eins");
myMap.put(new Integer(8), "acht");
myMap.put(new Integer(3), "drei");
myMap.put(new Integer(10), "zehn");
myMap.put(new Integer(100), "hundert");
Set keySet = myMap.keySet();
for(Iterator it=keySet.iterator();it.hasNext();System.out.println(myMap.get(it.next())));
}
|
watchout
Legendundead
|
import java.util.HashMap;
import java.util.Set;
import java.util.Iterator;
public static void main(String [] args) {
HashMap myMap = new HashMap();
myMap.put(new Integer(1), "eins");
myMap.put(new Integer(8), "acht");
myMap.put(new Integer(3), "drei");
myMap.put(new Integer(10), "zehn");
myMap.put(new Integer(100), "hundert");
Set keySet = myMap.keySet();
for(Iterator it=keySet.iterator();it.hasNext();System.out.println(myMap.get(it.next())));
}
sorry dass ich frage - ich mach erst seit mitte oktober java, und bin derzeit scheinbar noch nicht soweit diverse ungereimtheiten verstehen (zb. scheint 1.4 einen parser-fehler zu werfen wenn in einem function/method-header als type eine selbstdefinerte klasse vorkommt... egal) warum brauchst du "new Integer(1)" und reicht nicht einfach "1"?
|
murcielago
Dr. Doom
|
weil "int 1" kein objekt is, new Integer(1) aber schon und die map als key nur objekte nimmt.
|
watchout
Legendundead
|
weil "int 1" kein objekt is, new Integer(1) aber schon und die map als key nur objekte nimmt. ok, dank' dir
|
murcielago
Dr. Doom
|
gerne ![;)](/images/smilies/wink.gif) aja, hab nicht gesehen dass er den key auch noch ausgeben will, dann so: public class MyMain {
public static void main(String[] args) {
HashMap myMap = new HashMap();
myMap.put(new Integer(1), "eins");
myMap.put(new Integer(8), "acht");
myMap.put(new Integer(3), "drei");
myMap.put(new Integer(10), "zehn");
myMap.put(new Integer(100), "hundert");
Set keySet = myMap.keySet();
for (Iterator it = keySet.iterator(); it.hasNext();) {
Object key = it.next();
System.out.println(key.toString() + " -> " + myMap.get(key));
}
}
}
|
that
Hoffnungsloser Optimist
|
OK danke, offenbar ist Java wirklich so "bescheuert". ![;)](/images/smilies/wink.gif) (btw, eine C++ map entspricht einer Java TreeMap, sonst sind die Keys nicht sortiert) Komisch, dass man "new Integer(1)" schreiben muss, aber aus einem quoted String automatisch ein neues String-Objekt wird. Aber angeblich ist das ja mit 5.0 alles viel besser. Noch was: Wenn ich dazuschreibe myMap.put("haha", "hoho");
dann frisst das der Compiler ohne Mucken, aber ich bekomme eine böse ClassCastException zur Laufzeit. Jetzt ist natürlich klar, dass man in einer Map die Keys nicht aus Integers und Strings mischen kann, aber das angeblich so unsichere C++ findet den Fehler schon beim Compilieren. Aber angeblich ist das ja mit 5.0 alles viel besser. Einziges Problem: Bis die verbreiteten Application Server Java 5.0 unterstützen, wird es noch einige Jahre dauern. ![:(](/images/smilies/frown.gif) Als nächstes Java-bashing Projekt ![;)](/images/smilies/wink.gif) werde ich mal den Speicherbedarf einer ArrayList von 1000000 Integer-Objekten messen.
|
Ringding
Pilot
|
Als nächstes Java-bashing Projekt werde ich mal den Speicherbedarf einer ArrayList von 1000000 Integer-Objekten messen. Sei nicht so gemein... ![:D](/images/smilies/biggrin.gif) Ein String-Literal ist immer ein java.lang.String, ein Integer-Literal ist hingegen ein int und kein java.lang.Integer. Ist schon sinnvoll aus Gründen des Speicherbedarfs (u.a.), wenn auch nicht gerade sehr intuitiv...
|
murcielago
Dr. Doom
|
@that: wenn du in der schleife auf Integer zu casten versuchst ists klar, dass es dann schnalzt, wenn du aber nur den Key in ein Object holst und mit instanceof abfragst, dann kannst dir die exception auch sparen ![;)](/images/smilies/wink.gif) ja, mit java 5 braucht man das nicht mehr. @c++ compiler: tja, in c++ kann mans dann also nicht machen, in java kannst so aber jedes beliebige objekt (von jedem beliebigen typ) als key nehmen und in der selben map speichern.
Bearbeitet von murcielago am 16.12.2004, 01:00
|
that
Hoffnungsloser Optimist
|
@that: wenn du in der schleife auf Integer zu casten versuchst ists klar, dass es dann schnalzt, wenn du aber nur den Key in ein Object holst und mit instanceof abfragst, dann kannst dir die exception auch sparen ![;)](/images/smilies/wink.gif) Die Exception tritt schon beim Einfügen auf, da die TreeMap die Keys vergleichen muss.
|
gue
Addicted
|
@that: murcielago hat schon Recht, man kann die Keys schon mischen allerdings muss man dann der TreeMap "sagen", wie sie die Keys sortieren soll. Das macht man, indem man bei der Erstellung des Objekts einen Vergleicher ( ![:)](/images/smilies/smile.gif) ) angibt: TreeMap m = new TreeMap(new Comparator() {
public int compare(Object o1, Object o2) {
if (o1 != null && o2 != null) return o1.toString().compareTo(o2.toString());
else throw new NullPointerException("Cannot compare null");
}
});
|
that
Hoffnungsloser Optimist
|
@gue: Danke, wieder was gelernt. Sowas geht ja in C++ auch, hab ich aber bisher nie gebraucht. Aber es ist beruhigend dass es geht.
|