Avatar billede madox Nybegynder
07. maj 2003 - 17:16 Der er 15 kommentarer og
1 løsning

Hashtable ...unikke værdier ....?

Jeg har en hashtable hvor jeg indlæser en række værdier fx {jesper,"123",søren,"234"}
Hvordan sikrer jeg mig at der ikke kommer to ens værdier ind ?  fx
{jesper=123,søren=234, Lars=123} hvor jesper=123 og Lars=123
Avatar billede arne_v Ekspert
07. maj 2003 - 17:21 #1
Det kan Hashtable ikke gøre automatisk.

Du bliver nødt til selv at håndtere det ved at gemmes values i f.eks.
et HashSet og teste om de er der førend du gemmer.
Avatar billede tosssen Nybegynder
07. maj 2003 - 17:25 #2
En anden måde vil være at gemme værdierne omvendt i et andet Hashtable, således at det andet Hashtable's put-metode returnerer 123 når du prøver at indsætte det
Avatar billede tosssen Nybegynder
07. maj 2003 - 17:26 #3
Der returneres selvfølgelig kun 123 hvis 123 er en key i det andet Hashtable i forvejen, men det er jo lige præcis denne oplysning du skal bruge
Avatar billede tosssen Nybegynder
07. maj 2003 - 17:28 #4
Vrøvl - det andet Hashtable returnerer værdien, hvilket vil sige Jesper eller Lars. Det er dog ligegyldigt hvad der returneres, idet vi kun er interesserede i om der returneres null eller ej.
Avatar billede tosssen Nybegynder
07. maj 2003 - 17:35 #5
Hashtable h = new Hashtable();
Hashtable h_andet = new Hashtable();

public void indlaes(key k, value v)
{
  if(h_andet.put(v, k)==null)
      h.put(k, v);
}
Avatar billede roenving Novice
07. maj 2003 - 17:39 #6
Tricks er vel i orden !-)

Men ikke ligefrem den hurtigste metode:

For hver indlæsning udfører du en array.join("MeD En TeKsT, sOm Du GaRaNtErEt iKkE Har") og så søger du på et match med den foran og bagved.
Avatar billede roenving Novice
07. maj 2003 - 17:40 #7
Udskyld, kom til at se overskriften forkert, så jeg aner ikke om det er muligt i Java ...-)
Avatar billede madox Nybegynder
07. maj 2003 - 20:22 #8
er det ikke muligt at tjekke værdierne som ligger i hashtabellen før man tilføjer en ny? Altså skal den tjekke om 123 findes i tabellen....
Avatar billede arne_v Ekspert
07. maj 2003 - 20:25 #9
Ikke uden at løbe hele hash tabellen igennem.

For mindre hash tabeller kan du da sagtens det.

Men for meget store så vil det hurtigt blive tungt.

Men der er ikke noget indbygget.

Hashtable er bygget op om at det skal være nemt at finde
key - ikke at det skal være nemtat finde value.
Avatar billede madox Nybegynder
07. maj 2003 - 20:37 #10
Jeg har læst noget om "Enumeration", men har ikke helt forstået funktionen af det, hvad er det og kan det bruges til dette?
Avatar billede arne_v Ekspert
07. maj 2003 - 20:42 #11
Enumeration er noget man kan bruge til at løbe en Hashtable igennem.

Og det virker.

Du løber simpelthen alle elementerne igennem via Enumeration
og sammenligner værdierne.

Men ikke en elegant løsning.
Avatar billede arne_v Ekspert
07. maj 2003 - 20:47 #12
Eksempel:

import java.util.Enumeration;
import java.util.Hashtable;

public class HashTest {
    public static void main(String[] args) {
        Hashtable ht = new Hashtable();
        ht.put("a", "1");
        ht.put("bb", "2");
        Enumeration e = ht.elements();
        while (e.hasMoreElements()) {
            System.out.println((String) e.nextElement());
        }
    }
}
Avatar billede tosssen Nybegynder
07. maj 2003 - 21:09 #13
arne_v >> For god ordens skyld, du behøver ikke at caste til String når du skriver til skærmen, idet String nedarver fra Object, hvori toString() oprindeligt blev implementeret. String-klassen har naturligvis overskrevet implementeringen i Object, så strengen skrives ud.

Hvad er der i vejen med mit løsningsforslag, hvis madox ikke behøver en meget effektiv indlaesning?
Avatar billede arne_v Ekspert
07. maj 2003 - 21:39 #14
Din løsning er den effektive indlaesning.

Din løsning:
  1 logisk put => 2 fysiske put

Loopen:
  1 logisk put => N fysiske get + 1 put , N = antal elementer

Jeg forklarede om det fordi der blev spurgt om det.

Og jeg vil næsten altid caste i den slags kode. Der bliver kaldt den samme
toString uanset hvad, da alle metoder er virtuelle i Java. Men man
dokumenterer koden og man får en fejl hvis der er en anden type
objekt.
Avatar billede tosssen Nybegynder
07. maj 2003 - 21:45 #15
Ja ok - jeg havde ikke lige tænkt på castingen som en indirekte assertion ;-)
Avatar billede madox Nybegynder
08. maj 2003 - 13:16 #16
Jeg har fået det til at virke. Brugte arne_v 's løsning
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