Απορία για τα Hashtable

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
Ixthys_84
Buffer underflow exception
Buffer underflow exception
Posts: 2
Joined: Mon Nov 01, 2004 12:04 pm

Απορία για τα Hashtable

Post by Ixthys_84 » Mon Nov 01, 2004 3:08 pm

Καλησπέρα!
Μήπως θα μπορούσε κάποιος να μου εξηγήσει πως μπορούμε να διατρέξουμε ένα hastable και να επιλέγουμε διαδοχικές τιμές του hashtable? Σε έναν πίνακα για παράδειγμα το διατρέχουμε με ένα for.
Ευχαριστώ πολύ!!!!

:roll: :roll:
User avatar
Ethel
Venus Project Founder
Venus Project Founder
Posts: 2395
Joined: Fri Mar 19, 2004 10:41 am
Academic status: Alumnus/a
Gender:
Location: New York City, NY
Contact:

Post by Ethel » Mon Nov 01, 2004 3:23 pm

Μπορείς να κάνεις το εξής, να περάσεις τα στοιχεία του hashtable (είτε τα keys είτε τα values του) σε έναν πίνακα με το .toArray π.χ έστω ότι το κάνεις για τα κλειδιά τότε myHashtable.keysSet.toArray και αυτό το βάζεις σε έναν πίνακα. Και μετά τα γνωστά για να το διατρέξεις...for(....) κλπ
Ή ακόμα (κάτι που είδα στις έτοιμες print συναρτήσεις που μας έδωσε ο Τσατσαρώνης) αποθηκεύεις σε μια μεταβλητή τύπου Enumeration (π.χ την en) το hashtable.keys() κι ύστερα για να διατρέξεις το hashtable λες
while(en.hasMoreElements())
{μπλα μπλα μπλα}
Last edited by Ethel on Mon Nov 01, 2004 3:28 pm, edited 2 times in total.
There's no place like 127.0.0.1
User avatar
Einherjar
Venus Project Founder
Venus Project Founder
Posts: 3751
Joined: Tue Jan 27, 2004 4:42 pm
Academic status: Alumnus/a
Gender:
Location: Washington DC, USA
Contact:

Post by Einherjar » Mon Nov 01, 2004 3:26 pm

Εξαρτάται από το τι είδους διάσχιση θες να κάνεις. Διάσχιση στα κλειδιά, στις τιμές ή στα ζεύγη?
Για τα κλειδιά χρησιμοποιείς ένα αντικείμενο τύπου Enumerator. Δες τον κώδικα που μας έχει δώσει ο Τσατσαρώνης. Χρησιμοποιεί αυτή τη τεχνική.
Για τα άλλα 2 είδη, αν έχεις π.χ. ένα hashtable με όνομα table μπορείς να κάνεις τα ακόλουθα
Για να δεις μόνο τις τιμές κάνεις

Code: Select all

for(Iterator i=table.values().iterator();i.hasNext();){
     System.out.println(i.next());//Τυπώνει την τιμή (θέλει πιθανώς type casting)
}
Για τα ζευγάρια:

Code: Select all

Map.Entry me;
for(Iterator i=table.().entrySet().iterator();i.hasNext();){
     me=(Map.Entry)i.next();
     System.out.println(me.getKey());//Τυπώνει το κλειδί
     System.out.println(me.getValue);//Τυπώνει τη τιμή που αντιστοιχεί στο κλειδι
}
Να έχεις υπ'όψιν σου ότι με το Enumerator αλλάζοντας κάτι στο δείκτη που δείχνει στη δομή δεν αλλάζεις τη δομή, σε αντίθεση με τα 2 τελευταία παραδείγματα, που αν αλλάξεις κάτι μεταφέρεται και στη δομή
[Better to understand a little than to misunderstand a lot]
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Mon Nov 01, 2004 5:58 pm

Γι' αυτό που πρότεινε η Ethel παραπάνω έχε υπόψην σου πως στην ουσία αντιγράφεις τα keys σε ένα πίνακα και στην συνέχεια παίρνεις τα keys και τα πετάς στην συνάρτηση get() για να πάρεις την τιμή. Αυτό όμως δεν είναι και όχι καλύτερο γιατί στην ουσία αντιγράφεις σε ένα table τιμές(τα keys) που ήδη έχεις οπότε εάν το hasjtable έχει 10000 στοιχεία θα τα ξαναντιγράψεις...
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
Skeftomilos
bit level
bit level
Posts: 43
Joined: Fri Mar 04, 2005 8:08 am
Location: Ν.Κόσμος

Post by Skeftomilos » Sat Mar 05, 2005 1:59 pm

The easy way:

Code: Select all

Dim h As New System.Collections.Hashtable()

h.Add("Ryu", Nothing)
h.Add("Dhalsim", Nothing)
h.Add("Blanka", Nothing)
h.Add("Chun Li", Nothing)
h.Add("Honda", Nothing)
h.Add("Zangief", Nothing)
h.Add("Sagat", Nothing)
h.Add("M.Bison", Nothing)

Dim i As System.Collections.DictionaryEntry

For Each i In h
  MsgBox(i.Key)
Next i
:smile:
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.
User avatar
ailouros
Gbyte level
Gbyte level
Posts: 1041
Joined: Fri Apr 30, 2004 4:36 pm
Academic status: Alumnus/a
Contact:

Post by ailouros » Thu Aug 04, 2005 4:42 pm

Υπάρχει κανένας γρήγορος τρόπος να πάρουμε από Hashtable/Map το reverse του.
Το πρόβλημα είναι ότι τα values είναι κοινά για δίαφορα entries.Αν δοκιμάσω να το αντιστρέψω λόγω του ότι τα κλειδιά πρέπει να είναι μοναδικά θα κρατήσει μόνο ένα.Αυτό που σκέφτομαι είναι να τα κρατάω σε πίνακα δηλαδή:
Hashtable:
{"first"=2.1}
{"second"=2.1}
{"third"=4}

Reverse Hashtable:
{2.1=["first","second"]}
{4=["third"]}

Υπάρχει καμια έτοιμη μέθοδος για το παραπάνω;
User avatar
vangos
Mbyte level
Mbyte level
Posts: 571
Joined: Tue Mar 16, 2004 3:14 pm
Location: Heracleia@UTA

Post by vangos » Sat Aug 06, 2005 2:10 pm

Μαλλον μετά από 2 μερες θα την εχεις βρει μονος σου τη λύση αλλά σε περίπτωση που δεν την εχεις βρει σου γράφω μια που σκέφτηκα εγώ:

Έστω ότι το αρχικό Hashtable έχει στοιχεία της μορφής (String, Double).

Code: Select all

        Hashtable t=new Hashtable();
        Hashtable reversed=new Hashtable();

        ....
        ....
        
        Enumeration en=t.keys();
        while(en.hasMoreElements())
        {
            String key=(String)en.nextElement();
            Double d=(Double)t.get(key);
            
            if (!reversed.containsKey(d))
            {
                Vector v=new Vector();
                v.add(key);
                reversed.put(d, v);
            }
            else
            {
                Vector v=(Vector) reversed.get(d);
                v.add(key);
                reversed.put(d, v);

            }
        }
Βέβαια αντί για Vector μπορείς να βάλεις οποιαδήποτε άλλη δομή θέλεις.
Post Reply

Return to “Προγραμματισμός”