"We are back" « oc.at

Java Collections?

that 15.12.2004 - 23:08 622 11
Posts

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
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.

Code:
#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
Avatar
Registered: Oct 2002
Location: *
Posts: 2692
Code:
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von murcielago
Code:
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
Avatar
Registered: Oct 2002
Location: *
Posts: 2692
weil "int 1" kein objekt is, new Integer(1) aber schon und die map als key nur objekte nimmt.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von murcielago
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
Avatar
Registered: Oct 2002
Location: *
Posts: 2692
gerne ;)

aja, hab nicht gesehen dass er den key auch noch ausgeben will, dann so:

Code:
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
OK danke, offenbar ist Java wirklich so "bescheuert". ;)
(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

Code:
  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. :(

Als nächstes Java-bashing Projekt ;) werde ich mal den Speicherbedarf einer ArrayList von 1000000 Integer-Objekten messen.

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Zitat von that
Als nächstes Java-bashing Projekt ;) werde ich mal den Speicherbedarf einer ArrayList von 1000000 Integer-Objekten messen.
Sei nicht so gemein... :D

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
Avatar
Registered: Oct 2002
Location: *
Posts: 2692
@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 ;)

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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
Zitat von murcielago
@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 ;)

Die Exception tritt schon beim Einfügen auf, da die TreeMap die Keys vergleichen muss.

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
@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 (:)) angibt:
Code:
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
@gue: Danke, wieder was gelernt. Sowas geht ja in C++ auch, hab ich aber bisher nie gebraucht. Aber es ist beruhigend dass es geht. ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz