Προς το περιεχόμενο

LinkedList Array[ ]--->java πρόόόβλημα..


InDiO

Προτεινόμενες αναρτήσεις

Δημοσ.

Θέλω να δημιουργήσω ένα array που να περιέχει στοιχεία LinkedList. Έστω ότι το δημιουργώ έτσι, και καλλώ ένα constructorα ο οποιος για κάποιο n φτιανχει ένα object hashtable που είναι τύπυ array και παίρνει στοιχεία τύπου LinkedList. Σώστα;;

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">

import java.util.*;

public class hashtable

{

int slots;

ArrayList hashtable[];

 

hashtable(int n)

{

slots=n;//theseis tou hash table

hashtable=new ArrayList[slots];//to array tou hash table

}

[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Θέλω να εισάγω αριθμούς στο κάθε LinkedList του array, με τρόπο Hashtable.add(43), ας πούμε. Η μέθοδος

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public void hashIns(int hashtable[],int elem)

{

int pos=funct(elem);//παίρνουμε τη θέση εισαγωγής στο Array

((ArrayList)(hashtable[pos])).add(elem);

}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Δεν λειτουργεί(προφανώς)

ΠΩΣ πρέπει να το κάνω;;;;

Θέλω να υλοποιήσω ένα Hash table με αλυσίδες. Δεν θελω να χρησιμοποιήσω έτοιμη βιβλ.

 

<small>[ 23-09-2002, 23:40: Το μήνυμα επεξεργάστηκε από: InDiO ]</small>

Δημοσ.

Λοιπον καταρχην λιγο με μπερδεψες με την περιγραφη λοιπον.

 

Αν θες την κλαση μην την ονομαζεις hashtable , μπορει να μπερδευτεις ευκολα και να μπερδεψεις και τους αλλους διαλεξε κατι σε ΜyLinkHashtable , και παντα το ονομα της κλασης με κεφαλαιο!

 

Λοιπον περι το θεμα του hashing (υπαρχουν πολλοι τροποι να το υλοποιησεις ,παρολα αυτα αν θες να ειναι πραγματικο hashtable πρεπει να υλοποιηθει καποιο ειδος hashing).

 

Aπ' οτι καταλαβα εχεις ενα object hashtable το οποιο εσωτερικα διατηρει ενα array απο arraylist (~=vectors ).Οταν θες να εισαγεις κατι σε αυτη την δομη , δηλωνεις το index συγκεκριμενου arraylist απο το εσωτερικο array ,και κανεις add.

σωστα μεχρι τωρα?

 

στην μεθοδο hashIns γιατι περνας ενα array?

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public void hashIns(int hashtable[],int elem){[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">αν η θεωρηση που εχω κανει ειναι σωστη τοτς το μονο που πρεπει να περνας ειναι ενα int

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public void hashIns(int listIndex,int elem){[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Τελος μπορεις καλιστα να κανεις sort τα εσωτερικα arraylist (χρησιμοποιοντας Collections.sort()) για να μπορεις να βρισκεις ευκολα διαφορα element που αναζητας

 

Επισης πρεπει να προσεξεις πως ονομαζεις τα object σου , πχ το εσωτερικο array με τα araylist μην το ονομαζεις hashtable και αυτο .Δωσε του ενα πιο επεξηγηματικο ονομα πχ arrayOfLists ή internalLists κτλ .

 

Τελος στην μεθοδο

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public void hashIns(int hashtable[],int elem){ int pos=funct(elem);

((ArrayList)(hashtable[pos])).add(elem);

//ΤΟ CAST ΠΟΥ ΠΑΣ ΝΑ ΚΑΝΕΙΣ ΔΕΝ ΕΠΙΤΡΕΠΕΤΕ.INT->ARRAYLIST

}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">υποψηαζομαι οτι δεν ηθελες πραγματικα να κανεις αυτο το συγκεκριμενο cast γιατι εχεις μπερδεψει το εσωτερικο array των arraylist με την παραμετρο που περνας.

 

Επισης διαβασε το Java Api και συγκεκριμενα το java.util.ArrayList..δεν υπαρχει μεθοδος add(int) , υπαρχει μεθοδος

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">add(int index,Object obj )

add(Object obj)[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">ελπιζω να βοηθησα !

 

<small>[ 24-09-2002, 09:23: Το μήνυμα επεξεργάστηκε από: apoc ]</small>

Δημοσ.

Με μπέρδεψες πολύ ρε φίλε... Τί περιγραφή είναι αυτή που κάνεις; Χρησιμοποίησε ονόματα μεταβλητής που να ταιριάζουνε και να καταλαβαίνουμε τι θέλεις. Και προ παντώς προσπάθησε να ακολουθείς ένα τρόπο γραφής που ακολουθούνε οι πιο πολλοί Java προγραμματιστές. Όχι ότι θα γίνει κάτι αν δεν το κάνεις, απλώς θα μπορέσουμε να σε βοηθήσουμε πιο εύκολα.

 

Εγώ θα σου ξαναέλεγα να σκεφτείς από την αρχή τι θέλεις και να το καθαρογράψεις. Αν επιμένεις σε αυτόν τον κώδικα που μας έδωσες τότε εγώ θα πρότεινα να αλλάξεις (όπως πολύ σωστά είπε ο φίλος άποκ) το:

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">((ArrayList)(hashtable[pos])).add(elem);

}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">σε

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">hashtable[pos].add(new Integer(elem));[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">και άλλαξε και τη μέθοδο και κάνε την:

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public void hashIns(ArrayList [] hashtable,int elem)[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Και άλλη φορά καταχώρησε και το (τυχών) μήνυμα σφάλματος που σου βγάζει.

 

*Πρόσθεση σχολίων*

 

Αν το hashtable είναι παγκόσμια μεταβλητή (όπως είναι στο παράδειγμά σου) δε χρειάζεται καν να το περάσεις ως παράμετρο στη μέθοδο, αλλά απλώς κάλεσέ το. Αν το περάσεις ως παράμετρο τότε το hashtable που θα χρησιμοποιηθεί θα έχει σκοπό μόνο μέχρι να τελειώσει αυτή η μέθοδος και όχι έξω από αυτή (δηλαδή άλλες μέθοδοι δε θα μπορέσουνε να το χρησιμοποιήσουνε, εκτός και αν τις καλείς μέσω της hashIns και το περνάς ως παράμετρο).

 

Μπορείς να αλλάξεις τη μέθοδό σου ως

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public void hashIns(int elem)[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">

 

<small>[ 24-09-2002, 11:46: Το μήνυμα επεξεργάστηκε από: Γηρυόνης ]</small>

Δημοσ.

Έχετε δίκιο ρε παιδιά. Το πρόγραμμα είναι ακόμα αρκετά ασαφές στο κεφάλι μου, και ως εκ τούτου και στο χαρτί. Ο κώδικας που έδωσα ήταν μάλλον περισσότερο ψευδοκώδικας, για να καταλάβετε τι θέλω να πω!!!!

 

Το απογευματάκι θα επανέρθω για να κάνω μια καλύτερη προσσέγγιση..Μου δώσατε όμως ήδη αρκετές απαντήσεις. Ευχαριστώ και πάλι...Θα στείλω κάτι πιο δομημένο.Ciao

Δημοσ.

Επανέρχομαι με λεπτομέρειες. <img border="0" title="" alt="[Embarrassed]" src="images/icons/blush.gif" /> Για άλλη μια φορα δεν μπορω να καταλάβω γιατί τρώει κόλλημα(τι πρωτότυπο). Και παραθέτω τον κώδικα, αλλαγμένο.

Έχουμε το array table που παίρνει arraylists. Έχω μια μέθοδο που προσθέτει στοιχεία στο "σωστό" ArrayList.

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">import java.util.*;

public class hashtable

{

int slots; //theseis tou hash table

ArrayList table[]; //to array tou hash table

 

public hashtable(int n)

{

slots=n;

table=new ArrayList[slots];

/*for(int i=1;i>slots;i++)

table=new ArrayList();*/

}

 

private int funct(int x) //H hash function(me i mod slots)

{

return x%this.slots;

}

 

public void hashIns(int elem) //methodos gia eisagogi sto table, sti sosti thesi-arrayList

{

this.table[funct(elem)].add(new Integer(elem));

}

 

//excecution method

public static void main(String args[])

{

hashtable h=new hashtable(5);

System.out.println("hash table size "+h.table.length);

for(int i=0;i<5;i++)

System.out.println("hashtable slot "+i+" contains " +h.table);

h.hashIns(96);

}

}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Έχω και μία δοκιμαστική main για να μπορω να κάνω debugging. Μάλλον το πρόβλημα είναι κάτι χαζό.

Exception in thread "main" java.lang.NullPointerException

at hashtable.hashIns(hashtable.java:29)

at hashtable.main(hashtable.java:55)

To error code

Ευχαριστώ

Δημοσ.

Είσαι σίγουρος ότι δεν έχεις ArrayIndexOutOfBoundsException; Θα περίμενα να σου βγάλει αυτό το μήνυμα σφάλματος. Κάνε μία δοκιμή. ?λλαξε τη γραμμή

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">for(int i=0;i<5;i++)

System.out.println("hashtable slot "+i+" contains " +h.table);[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">και κάνε την

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">for(int i=0;i<=5;i++)

System.out.println("hashtable slot "+i+" contains " +h.table);[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">και πες μα τι γίνεται. Επίσης πρόσεξε ότι ενώ δημιουργείς έναν πίνακα που δέχεται πέντε στοιχεία τύπου ArrayList (table=new ArrayList[slots] ;) ποτέ δεν του δίνεις αρχικές τιμές με αποτέλεσμα ο πίνακας σου να είναι μεν αρχικού μεγέθους 5 στοιχείων τα δε αυτά στοιχεία είναι όλα κενά (null) και όχι ArrayList. Ο,τιδήποτε προσπαθείς να προσθέσεις σε αυτά τα στοιχεία θα σου δώσει NullPointerException. Για να λυθεί αυτό το πρόβλημα πρέπει να δώσεις αρχικές τιμές στα στοιχεία του πίνακα με έναν πολύ απλό βρόχο. Βγάλε τα σχόλια του for βρόχου σου και κάνε:

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">for(int i=1;i<=slots;i++)

table=new ArrayList();[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">ώστε ο πίνακάς σου να περιέχει πέντε στοιχεία τύπου ArrayList και όχι κενά.

 

<small>[ 24-09-2002, 21:36: Το μήνυμα επεξεργάστηκε από: Γηρυόνης ]</small>

Δημοσ.

Χα Χα, τι μ@λ@κία...Αν προσέξεις Γηρυόνη, εκεί που φτιάχνω τον constructor hashtable, έχω κατι σχόλια! Είχα ήδη δοκιμάσει να κάνω αυτό που λές, την αρχικοποιηση των ArrayList...

 

Όμως κοίτα τι λάθος έχει το for loop!!! Δεν εκτελέστηκε ποτέ!!!!

<img border="0" title="" alt="[big Grin]" src="images/icons/grin.gif" /> <img border="0" title="" alt="[big Grin]" src="images/icons/grin.gif" />

Γαμώτο, παραλίγο και θα το είχα φτιάξει μόνος μου!!!! <img border="0" title="" alt="[Razz]" src="images/icons/tongue.gif" /> <img border="0" title="" alt="[Razz]" src="images/icons/tongue.gif" /> <img border="0" title="" alt="[Razz]" src="images/icons/tongue.gif" />

 

THANXXXXX

Δημοσ.

Ναι το πρόσεξα.. Ο βρόχοςόντως δεν εκτελέστηκε ποτέ... Αλλά μη φοβού, όλοι έχουμε περάσει από εκεί. ʼλλωστε τα μεγάλα μυαλά κολλάνε σε μικρά πράγματα χεχε ]:-)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...