Avatar billede kovalt Nybegynder
16. december 2002 - 22:01 Der er 18 kommentarer og
1 løsning

Vælge tilfældig post i et HashMap

Hej....

  tja.... hvorledes gøres det?
Avatar billede arne_v Ekspert
16. december 2002 - 22:09 #1
Forkert valg af container.

HashMap hm;
int n = (int)(Math.random() * hm.size();
Iterator it = hm.keySet().iterator();
for(int i = 0; i <= n ; n++) {
  String key = it.next();
  X value = hm.get(key);
}System.out.println(key + " " + value);
Avatar billede arne_v Ekspert
16. december 2002 - 22:11 #2
Derimod:

ArrayList al;
int n = (int)(Math.random() * al.size();
Z o = al.get(n);
System.out.println(o.getKey() + " " + o.getValue());
Avatar billede arne_v Ekspert
16. december 2002 - 22:13 #3
Din kode vil måske se lidt anderledes ud, da jeg gætter lidt.

Men ihvertfald er HashMap ikke et optimalt valg til at
picke en random post i.
Avatar billede erikjacobsen Ekspert
16. december 2002 - 22:14 #4
Du kan smide nøglerne over i et array (via keySet()) og
så vælge en af dem. Men det koster lidt. Hvad skal du
bruge det til?
Avatar billede kovalt Nybegynder
16. december 2002 - 22:14 #5
takker
Avatar billede kovalt Nybegynder
16. december 2002 - 22:16 #6
Det er fordi har en opgave hvor jeg er i gang med et spil (meget primitivt).

Spillet består af en masse rum og et af kravene er at et tilfældig rum skal være et "transporter room" altså et rum hvir man bliver virdersendt til et nyt tilfældig rum....

Alle mine rum indlæses fra en fil i et hashMap og derfra skal jeg så vælge rummet
Avatar billede erikjacobsen Ekspert
16. december 2002 - 22:20 #7
Hvis du kun en sjælden gang skal vælge et tilfældigt rum, oftest
skal slå op via din hashmap, kan du jo blot

String a[] = hashmap.keySet().toArray();
int n = (int)(Math.random() * a.length;
String key = a[n];

hvis nøglen er String (utestet)
Avatar billede arne_v Ekspert
16. december 2002 - 22:21 #8
Hvis rummene er konstante gennem spillene, så kan du overveje
at lave et String array med rum navnene (eller hvad der nu er
key i HashMap'en) og slå op i det array.

HashMap hm;
String[] keylist;
int n = (int)(Math.random() * keylist.length);
String key = keylist[n];
X = hm.get(key);

Det vil være lidt hurtigere. Om det er umagen værd afhænger af
hvor tit det skal køres.
Avatar billede kovalt Nybegynder
16. december 2002 - 23:07 #9
Jeg er ikke helt med på hvordan eks virker Arne V....

Erik: når jeg kører dit får jeg en kompileringsfejl med inkompatible typer på denne linie....

String a[] = roomMap.keySet().toArray();

nøglen i mit roomMap er 3 tal der er sat sammen til et tal (et koordinatsæt for det enkelte rum).... det virker dog stadig ikke selvom jeg ændrer det til

int a[] = roomMap.keySet().toArray();
Avatar billede kovalt Nybegynder
16. december 2002 - 23:10 #10
nøglen kunne eksempelvis være 3,2,1
Avatar billede kovalt Nybegynder
16. december 2002 - 23:19 #11
Hvis jeg bruger den her:

HashMap hm;
int n = (int)(Math.random() * hm.size();
Iterator it = hm.keySet().iterator();
for(int i = 0; i <= n ; n++) {
  String key = it.next();
  X value = hm.get(key);
}System.out.println(key + " " + value);

får jeg samme fejl på linien:

String key = it.next();

INCOPATIBLE TYPEN!
Avatar billede erikjacobsen Ekspert
16. december 2002 - 23:22 #12
Det var kun en skitse.
Object a[] = roomMap.keySet().toArray();
er vel korrekt.
Avatar billede kovalt Nybegynder
16. december 2002 - 23:31 #13
Nu kan det kompileres..... i runtime giver det imidlertid fejlen "NoSuchElementException" på linien:

key = (String) it.next();

hvad kan det være?
Avatar billede kovalt Nybegynder
16. december 2002 - 23:42 #14
Det er fordi den ikke stopper når for-løkken kommer til n... den kører bare videre........ hmmm
Avatar billede erikjacobsen Ekspert
16. december 2002 - 23:46 #15
Du skal ikke bruge iteratorer hvis du tager det ud i et array,
Hvad skriver du?
Avatar billede kovalt Nybegynder
16. december 2002 - 23:54 #16
det var fordi det var n der blev plusset en i for-lkken *GG*
Avatar billede erikjacobsen Ekspert
16. december 2002 - 23:56 #17
Du bruger vel ikke iterator hvis du tager udgangspunkt i
array-et ??
Avatar billede arne_v Ekspert
17. december 2002 - 07:08 #18
HashMap hm;

// en gang
String[] keylist = new String[hm.size()];
Iterator it = hm.keySet().iterator();
int n = 0;
while(it.hasNext()) {
  keylist[n] = (String)it.next();
  n++;
}

// hver gang du skal have tilfældig
int n = (int)(Math.random() * keylist.length);
String key = keylist[n];
X = (X)hm.get(key);
Avatar billede erikjacobsen Ekspert
17. december 2002 - 10:18 #19
Det kan nu ikke betale sig at trække elementerne ud selv, når
Set har en toArray()
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester