Εργαστήριο Java Lab 12 Αντικείμενο: Δομές Δεδομένων Πακέτο java.util Κλάση Vector και interface Enumeration H κλάση Vector έχει τα χαρακτηριστικά ενός array αλλά το μέγεθός της μπορεί να αλλάζει δυναμικά. Αν απαιτηθεί επιπλέον χώρος για ένα Vector από αυτόν που έχει ήδη δεσμευθεί γι' αυτό τότε είτε εάν ο προγραμματιστής το καθορίσει αυξάνεται ο διαθέσιμος χώρος σύμφωνα με την επιλογή του είτε διπλασιάζεται ο δεσμευμένος χώρος για το Vector. Τα Vectors αποθηκεύουν αναφορές σε αντικείμενα ιαθέσιμοι κατασκευαστές είναι: Vector() ημιουργεί Vector με 10 θέσεις. Vector(int x) ημιουργεί Vector με x θέσεις. Vector(Collection x) ημιουργεί αντίγραφο του Collection και το τοποθετεί σε Vector. Μέθοδοι void addelement(object obj) void insertelementat(object obj, int index) void setelementat(object obj, int index) boolean removeelement(object x) void removeallelements() boolean removeelementat(int index) Object elementat(int index) boolean contains(object elem) int indexof(object elem) int size() Enumeration elements() ιαγράφει όλα τα στοιχεία του διανύσματος Ελέγχει αν (με την μέθοδο equals) υπάρχει το elem στo Vector. Επιστρέφει την θέση στην οποία βρίσκεται η 1 η εμφάνιση του elem. Πλήθος στοιχείων στο Vector Επιστρέφει ένα Enumeration με το οποίο μπορούμε να διανύσουμε τα στοιχεία. Τα Vectors χρησιμοποιούν την διασύνδεση Enumeration και τις μεθόδους Object nextelement() επιστρέφει το επόμενο αντικείμενο του Vector boolean hasmoreelements() ελέγχει αν υπάρχει επόμενο στοιχείο στο Vector H Java έχει ένα σύνολο από έτοιμες δομές δεδομένων καθώς και συναρτήσεις που επιδρούν πάνω σε αυτές. Στην Java είναι πολύ σημαντική η έννοια της συλλογής (Collection). Μια συλλογή είναι μια δομή δεδομένων που μπορεί να κρατά άλλα αντικείμενα. Κλάση Arrays
Στατικές μέθοδοι: binarysearch, equals, fill, sort Άσκηση 1 Πρόγραμμα που επιδεικνύει κάποιες από τις μεθόδους της κλάσης Arrays public class Lab12_01 public static void main(string []args) int a[]=12,56,78,23,88,90,45,99,13,82; int b[]=new int[10]; Arrays.fill(b,1); System.out.println("Fill array with zeroes "); printintarray(b); Arrays.sort(a); System.out.println("Sorted Array "); printintarray(a); System.out.println("Search for 23 found at " + Arrays.binarySearch(a,23)); boolean f=arrays.equals(a,b); System.out.println("Array a and b are equal "+ f); String c[]="agrinio", "Mesolongi", "Nafpaktos"; List li1; li1=arrays.aslist(c); System.out.println("Array before "); printobjarray(c); printlist(li1); li1.set(1,"amfilohia"); System.out.println("Changed Array "); printobjarray(c); printlist(li1); public static void printintarray(int x[]) for (int i=0;i<x.length;i++) System.out.print(x[i]+ " "); System.out.println(); public static void printobjarray(object x[]) for (int i=0;i<x.length;i++) System.out.print(x[i]+ " "); System.out.println(); public static void printlist(list l) for (int i=0;i<l.size();i++) System.out.print(l.get(i)+ " "); System.out.println(); Interface List ιαταγμένη συλλογή που μπορεί να περιέχει και διπλότυπα στοιχεία. Κληρονομεί από το interface Collection. Οι ακόλουθες κλάσεις υλοποιούν το interface List Vector: ιάνυσμα ArrayList: Πίνακας με δυνατότητα αλλαγής μεγέθους (όμοια με τα Vectors απλά έχουν μεγαλύτερη ταχύτητα και συνίσταται η χρήση τους σε μη multithreaded εφαρμογές) LinkedList: Συνδεδεμένη λίστα Διανύσματα (Vectors και ArrayLists) Άσκηση 2 Να γράψετε πρόγραμμα που να δέχεται από τον χρήστη διάφορες πραγματικές αριθμητικές τιμές και να
υπολογίζει το πλήθος από τις τιμές που δόθηκαν και είναι μεγαλύτερες από τον μέσο όρο. Να μην χρησιμοποιηθεί κάποια στατική δομή πίνακα αλλά να χρησιμοποιηθεί η κλάση java.util.vector (ή εναλλακτικά η java.util.arraylist) έτσι ώστε να δημιουργηθεί ένα διάνυσμα το οποίο θα μεγαλώνει όσο ο χρήστης εισάγει τιμές. import java.util.vector; import java.util.enumeration; //import java.util.arraylist; //import java.util.iterator; import javax.swing.*; public class Lab12_02 Vector v=new Vector(); //ArrayList al=new ArrayList(); String s; double x, sum=0.0; int c=0; do s=joptionpane.showinputdialog(" ώσε ένα βαθμό (-1 για τερματισμό) "); x=double.parsedouble(s); if (x!=-1) v.addelement(new Double(x)); //al.add(new Double(x)); sum=sum+x; c++; while (x!=-1); double avg=sum / c; Enumeration e=v.elements(); //Iterator it=al.iterator(); int r=0; while (e.hasmoreelements()) //while (it.hasnext()) Double d; d=(double) e.nextelement(); //d=(double) it.next(); x=d.doublevalue(); if (x>avg) r++; JOptionPane.showMessageDialog(null, "Πλήθος τιμών μεγαλύτερων του μέσου όρου " + r, "Πληροφορία", 1); System.exit(0); Linked Lists Μέθοδοι των αντικειμένων LinkedList add(object x) Προσθέτει το αντικείμενο x στο τέλος της λίστας add(int a, Object x) Προσθέτει το αντικείμενο x στην 3 η θέση της λίστας addfirst(object x) Προσθέτει το αντικείμενο x ως πρώτο στοιχείο της λίστας addall(linkedlist x) Προσθέτει τα περιεχόμενα της λίστας x στο τέλος της λίστας listiterator() Επιστρέφει έναν iterator 2 κατευθύνσεων Μέθοδοι των αντικειμένων ListIterator boolean hasnext() Ελέγχει το εάν υπάρχει επόμενο στοιχείο boolean hasprevious() Ελέγχει το εάν υπάρχει προηγούμενο στοιχείο
Object next() Object previous() remove() Επιστρέφει το επόμενο στοιχείο Επιστρέφει το προηγούμενο στοιχείο Αφαιρεί το στοιχείο από την λίστα Άσκηση 3 Χρησιμοποιώντας την κλάση LinkedList δημιουργήστε μια διπλά συνδεδεμένη λίστα με τα ονόματα φοιτητών (panos, maria, kostas, petros, christos, sofia). Εμφανίστε τα ονόματα και τα μήκη τους από το πρώτο προς το τελευταίο και από το τελευταίο προς το πρώτο. Επιπλέον να ταξινομηθεί η λίστα χρησιμοποιώντας την στατική μέθοδο sort της κλάσης Collections. public class Lab12_03 LinkedList ll=new LinkedList(); ll.add("panos"); ll.add("maria"); ll.add("kostas"); ll.add("petros"); ll.add("christos"); ll.add("sofia"); ListIterator li=ll.listiterator(0); while (li.hasnext()) System.out.println(li.next()); li=ll.listiterator(ll.size()); System.out.println("\nREVERSE \n"); while (li.hasprevious()) System.out.println(li.previous()); System.out.println("\n " +ll); //Εκτύπωση της λίστας Collections.sort(ll); //ταξινόμηση της λίστας με την static μέθοδο sort της κλάσης Collections System.out.println("\n " +ll); //Εκτύπωση της ταξινομημένης λίστας System.exit(0); Κλάση Dictionary Ένα Dictionary αντιστοιχεί κλειδιά σε τιμές. Η κλάση Hashtable κληρονομεί από την Dictionary. H Dictionary έχει τις παρακάτω abstract μεθόδους Enumeration elements() Enumeration keys() Object put(object key, Object value) remove(object key) Object get(object key) boolean isempty() Επιστρέφει ένα enumeration με τις τιμές του Dictionary. Επιστρέφει ένα enumeration με τα κλειδιά του Dictionary. Εισάγει το ζεύγος key, value. ιαγραφή του ζεύγους με κλειδί key. Επιστρέφει το value τμήμα από το key-value ζεύγος. Ελέγχει εάν είναι άδειο το Dictionary. Πίνακες κατακερματισμού (hash table) Οι πίνακες συσχετίζουν κλειδιά με τιμές και δεν μπορούν να περιέχουν 2 φορές το ίδιο κλειδί. Οι κλάσεις Hashtable, HashMap, TreeMap υλοποιούν το Map interface
boolean containskey(object key) boolean containsvalue(object value) clear() Ελέγχει αν υπάρχει το αντίστοιχο κλειδί στο Hashtable. Ελέγχει αν υπάρχει η αντίστοιχη τιμή στο Hashtable. Αδειάζει το Hashtable. Άσκηση 4 Να κατασκευάσετε πρόγραμμα που να δημιουργεί ένα hashtable στο οποίο θα αποθηκεύονται τηλέφωνα υπηρεσιών του ΤΕΙ. Ο χρήστης δίνοντας το όνομα μιας υπηρεσίας να διαγράφει από το hashtable την αντίστοιχη εγγραφή αν υπάρχει και στην συνέχεια να εμφανίζονται οι εγγραφές με την μορφή: Department: ΧΧΧΧΧΧΧΧΧ Phone: ΧΧΧΧΧΧΧ. import javax.swing.*; public class Lab12_04 Hashtable h=new Hashtable(); h.put("gra","2631058354"); h.put("fax","2631058355"); h.put("tei","2631058201"); System.out.println("" + h); //Εκτύπωση όλου του hashtable String s; s=joptionpane.showinputdialog(" ώσε κλειδί για διαγραφή εγγραφής"); String r=(string) h.get(s); if (r==null) System.out.println("No Data"); else System.out.println("DELETED " + r); h.remove(s); Enumeration ek=h.keys(); Enumeration ev=h.elements(); while (ek.hasmoreelements()) System.out.println("\nDEPARTMENT: " + ek.nextelement()+ "\tphone: " + ev.nextelement()); System.out.println("\n " +h); System.exit(0); Κλάση HashSet Η συλλογή Set δεν περιέχει διπλότυπα και υλοποιείται με την κλάση HashSet. H κλάση TreeSet υλοποιεί το interface SortedSet που κληρονομεί από το Set και διατηρεί τα στοιχεία του σε ταξινομημένη σειρά. Άσκηση 5 Κατασκευάστε πρόγραμμα που να αφαιρεί από μια λίστα λεκτικών τις διπλότυπες εγγραφές να την ταξινομεί σε φθίνουσα σειρά και να την εμφανίζει εκ νέου. public class Lab12_05 String []a="sony", "eizo", "nec", "samsung", "nokia", "sony", "nec"; List x=arrays.aslist(a); System.out.println("List: " + x); HashSet hs1=new HashSet(x); System.out.println("Hashed Set: " + hs1); ArrayList al=new ArrayList(Arrays.asList(hs1.toArray())); Collections.sort(al,Collections.reverseOrder());
System.out.println("List: " + al); Κλάση Properties Πρόκειται για ένα μόνιμο Hashtable κατά την έννοια ότι τα περιεχόμενά του μπορούν να αποθηκευθούν στον δίσκο. Αντί για τις μεθόδους get και set χρησιμοποιούνται οι μέθοδοι getproperty και setproperty. Άσκηση 6 Να κατασκευάσετε πρόγραμμα που να αποθηκεύει σε ένα αρχείο "TELCODE.DAT" τα περιεχόμενα ενός λεξικού με τους τηλεφωνικούς κωδικούς (κλειδιά) και τα ονόματα των περιοχών (τιμές). import java.io.*; public class Lab12_06a Properties pht=new Properties(); pht.setproperty("2641", "Agrinio"); pht.setproperty("2631", "Mesolongi"); pht.setproperty("2651", "Ioannina"); pht.setproperty("261", "Patra"); try FileOutputStream fos=new FileOutputStream("TELCODE.DAT"); pht.store(fos, "Telephone codes"); fos.close(); catch(ioexception ex) ex.printstacktrace(); Να κατασκευάσετε πρόγραμμα που να διαβάζει και να εμφανίζει το παραπάνω αρχείο. import java.io.*; public class Lab12_06b Properties pht=new Properties(); try FileInputStream fis=new FileInputStream("TELCODE.DAT"); pht.load(fis); fis.close(); catch(ioexception ex) ex.printstacktrace(); Enumeration e=pht.propertynames(); while (e.hasmoreelements()) String k, v; k=e.nextelement().tostring(); v=pht.getproperty(k); System.out.println(k + " "+ v); ομή στοίβας Η κλάση java.util.stack περιέχει την υλοποίηση της δομής της στοίβας και κληρονομεί από την κλάση Vector.
Mέθοδοι Object push(object item) Object pop() Object peek() int search(object x) boolean empty() εισάγει το αντικείμενο item στην στοίβα εξάγει το κορυφαίο αντικείμενο της στοίβας επιστρέφει χωρίς να εξάγει το κορυφαίο αντικείμενο της στοίβας επιστρέφει την απόσταση του αντικειμένου x από την κορυφή της στοίβας ελέγχει αν η στοίβα είναι άδεια Άσκηση 7 Να κατασκευάσετε πρόγραμμα που να εισάγει σε μια στοίβα 10 αντικείμενα λεκτικά και στην συνέχεια να τα αποσύρει. public class Lab12_07 Stack s=new Stack(); for (int i=1;i<=10;i++) s.push("item " +i); System.out.println("Item 10 found at: "+s.search("item 10")); System.out.println("Stack: " + s); Enumeration e=s.elements(); StringBuffer sb=new StringBuffer(); while (e.hasmoreelements()) sb.append(e.nextelement()); sb.append(" <-> "); System.out.println(sb.toString()); while (!s.empty()) String si = (String) s.pop(); System.out.println("Item popped out: " + si);