Page 1 of 1
Απορία για τα Hashtable
Posted: Mon Nov 01, 2004 3:08 pm
by Ixthys_84
Καλησπέρα!
Μήπως θα μπορούσε κάποιος να μου εξηγήσει πως μπορούμε να διατρέξουμε ένα hastable και να επιλέγουμε διαδοχικές τιμές του hashtable? Σε έναν πίνακα για παράδειγμα το διατρέχουμε με ένα for.
Ευχαριστώ πολύ!!!!

Posted: Mon Nov 01, 2004 3:23 pm
by Ethel
Μπορείς να κάνεις το εξής, να περάσεις τα στοιχεία του hashtable (είτε τα keys είτε τα values του) σε έναν πίνακα με το .toArray π.χ έστω ότι το κάνεις για τα κλειδιά τότε myHashtable.keysSet.toArray και αυτό το βάζεις σε έναν πίνακα. Και μετά τα γνωστά για να το διατρέξεις...for(....) κλπ
Ή ακόμα (κάτι που είδα στις έτοιμες print συναρτήσεις που μας έδωσε ο Τσατσαρώνης) αποθηκεύεις σε μια μεταβλητή τύπου Enumeration (π.χ την en) το hashtable.keys() κι ύστερα για να διατρέξεις το hashtable λες
while(en.hasMoreElements())
{μπλα μπλα μπλα}
Posted: Mon Nov 01, 2004 3:26 pm
by Einherjar
Εξαρτάται από το τι είδους διάσχιση θες να κάνεις. Διάσχιση στα κλειδιά, στις τιμές ή στα ζεύγη?
Για τα κλειδιά χρησιμοποιείς ένα αντικείμενο τύπου 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 τελευταία παραδείγματα, που αν αλλάξεις κάτι μεταφέρεται και στη δομή
Posted: Mon Nov 01, 2004 5:58 pm
by HdkiLLeR
Γι' αυτό που πρότεινε η Ethel παραπάνω έχε υπόψην σου πως στην ουσία αντιγράφεις τα keys σε ένα πίνακα και στην συνέχεια παίρνεις τα keys και τα πετάς στην συνάρτηση get() για να πάρεις την τιμή. Αυτό όμως δεν είναι και όχι καλύτερο γιατί στην ουσία αντιγράφεις σε ένα table τιμές(τα keys) που ήδη έχεις οπότε εάν το hasjtable έχει 10000 στοιχεία θα τα ξαναντιγράψεις...
Posted: Sat Mar 05, 2005 1:59 pm
by Skeftomilos
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

Posted: Thu Aug 04, 2005 4:42 pm
by ailouros
Υπάρχει κανένας γρήγορος τρόπος να πάρουμε από Hashtable/Map το reverse του.
Το πρόβλημα είναι ότι τα values είναι κοινά για δίαφορα entries.Αν δοκιμάσω να το αντιστρέψω λόγω του ότι τα κλειδιά πρέπει να είναι μοναδικά θα κρατήσει μόνο ένα.Αυτό που σκέφτομαι είναι να τα κρατάω σε πίνακα δηλαδή:
Hashtable:
{"first"=2.1}
{"second"=2.1}
{"third"=4}
Reverse Hashtable:
{2.1=["first","second"]}
{4=["third"]}
Υπάρχει καμια έτοιμη μέθοδος για το παραπάνω;
Posted: Sat Aug 06, 2005 2:10 pm
by vangos
Μαλλον μετά από 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 μπορείς να βάλεις οποιαδήποτε άλλη δομή θέλεις.