====== java.util.List ====== Το interface [[http://docs.oracle.com/javase/7/docs/api/java/util/List.html|List]] υλοποιεί μία διπλά διασυνδεδεμένη λίστα. Η βασικές διαφορές σε σχέση με το [[http://docs.oracle.com/javase/7/docs/api/java/util/Set.html|Set]] interface είναι ότι ένα αντικείμενο μπορεί να εμφανίζεται περισσότερες από μία φορές μέσα στη λίστα. Επίσης η σειρά των αντικειμένων στη λίστα διατηρείται και είναι η σειρά με την οποία εισήχθησαν (όλα τα νέα αντικείμενα εισάγονται στο τέλος της λίστας). Μπορείτε να σκεφτείτε την λίστα σαν ένα πίνακα, όπου έχετε πρόσβαση στο i-στο στοιχείο του. Το interface //List// ορίζει τις εξής επιπλέον μεθόδους σε σχέση με το interface //Collection//. * **[[http://docs.oracle.com/javase/7/docs/api/java/util/List.html#get(int)|get(int index)]] - ** Επιστρέφει την τιμή στην θέση //index//. * **[[http://docs.oracle.com/javase/7/docs/api/java/util/List.html#indexOf(java.lang.Object)|indexOf(Object o)]] - ** Επιστρέφει την 1η θέση του αντικειμένου στην λίστα ή -1 αν δεν περιέχεται το αντικείμενο. * **[[http://docs.oracle.com/javase/7/docs/api/java/util/List.html#lastIndexOf(java.lang.Object)|lastIndexOf(Object o)]] - ** Επιστρέφει την τελευταία θέση του αντικειμένου στην λίστα ή -1 αν δεν περιέχεται το αντικείμενο. * **[[http://docs.oracle.com/javase/7/docs/api/java/util/List.html#subList(int,%20int)|subList(int fromIndex, int toIndex)]] - ** Επιστρέφει μία υπολίστα της αρχικής λίστας, από //fromIndex// έως //toIndex//. * **[[http://docs.oracle.com/javase/7/docs/api/java/util/List.html#set(int,%20E)|set(int index, E element)]] -** Αντικαθιστά το αντικείμενο στην θέση //index// με το //element// επιστρέφοντας το αντικείμενο που ήταν αρχικά αποθηκευμένο. Εάν το //index// που δίνεται είναι εκτός των ορίων της λίστας throws //IndexOutOfBoundsException//. * Η μέθοδος [[http://docs.oracle.com/javase/7/docs/api/java/util/List.html#listIterator()|listIterator()]] επιστρέφει ένα [[http://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html|ListIterator]] object που επιτρέπει την διάτρεξη της λίστας και προς τις δύο κατευθύνσεις. Δείτε το παράδειγμα που ακολουθεί και διατρέχεται η λίστα από το τέλος προς την αρχή. for (ListIterator it = list.listIterator(list.size()); it.hasPrevious(); ) { Type t = it.previous(); ... } ===== Υλοποιήσεις ===== Υπάρχουν δύο βασικές κλάσεις που υλοποιούν το συγκεκριμένο interface, [[https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html|ArrayList]] και [[https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html|LinkedList]]. Κάθε μία υλοποίηση έχει θετικά και αρνητικά σημεία. Συνήθως χρησιμοποιούμε την ArrayList, παρακάτω γίνεται σύντομη απαρίθμηση των θετικών και αρνητικών στοιχείων των δύο υλοποιήσεων. * **Χρόνος εντοπισμού ενός στοιχείου με βάση τη θέση του:** Η //ArrayList// έχει σταθερό χρόνο αναζήτησης, ενώ η //LinkedList// έχει γραμμικό χρόνο αναζήτησης. * **Εισαγωγή στοιχείου στο τέλος:** Και οι δύο έχουν τον ίδιο χρόνο εισαγωγής. * **Εισαγωγή στοιχείου στην αρχή ή στην μέση:** Η //ArrayList// έχει γραμμικό χρόνο εισαγωγής ως προς το μέγεθος της λίστας, ενώ η //LinkedList// έχει σταθερό χρόνο. * Η [[https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html|LinkedList]] έχει τις επιπλέον μεθόδους [[https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html#addFirst-E-|addFirst]], [[https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html#getFirst--|getFirst]], [[https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html#removeFirst--|removeFirst]], [[https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html#addLast-E-|addLast]], getLast και removeLast. * Η [[https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html|LinkedList]] υλοποιεί το [[https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html|Queue]] interface. ===== Παράδειγμα 1o ===== Το παράδειγμα που ακολουθεί δημιουργεί μία λίστα από αντικείμενα τύπου Student, εισάγοντας στοιχεία στην αρχή, στο τέλος και ενδιάμεσα μέσα στη λίστα. Στη συνέχεια, η λίστα εκτυπώνεται με τρεις διαφορετικούς τρόπους: * με χρήση enhanced for loop. * με χρήση ListIterator διατρέχοντας τη λίστα και προς τις δύο κατευθύνσεις. * με χρήση for και λήψη των περιεχομένων της λίστας με βάση τη θέση τους μέσω της συνάρτησης get. import java.util.*; import java.lang.*; public class StudentList { public static void iterateList1(List students) { for(Student st: students) { System.out.println(st.toString()); } } public static void iterateList2(List students) { ListIterator it = students.listIterator(); System.out.println("####### Forward ########"); while( it.hasNext() ) { System.out.println(it.next().toString()); } System.out.println("####### Reverse ########"); while( it.hasPrevious() ) { System.out.println(it.previous().toString()); } } public static void iterateList3(List students) { for(int i=0; i students; students = new LinkedList(); students.add(new Student("John", "Smith")); // add at the end of the list students.add(0, new Student("Stanley", "Peters")); // add the beginning of the list students.add(1, new Student("Edgar", "Bloch")); // add at pos 1 of the list students.add(2, new Student("Suzan", "Miles")); // add at pos 1 of the list students.add(0, new Student("Mary", "Poppins")); // add the beginning of the list iterateList1(students); System.out.println("---------"); iterateList2(students); System.out.println("---------"); iterateList3(students); } } ===== Παράδειγμα 2o ===== Το παράδειγμα που ακολουθεί διαβάζει από ένα αρχείο κειμένου μια σειρά από λέξεις με τη βοήθεια της κλάσης [[https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html|java.util.Scanner]]. Τα γράμματα κάθε λέξης μετατρέπονται σε πεζά πριν αποθηκευτούν στη λίστα. import java.util.*; import java.io.*; public class ListExample { public static void main(String []args) { List wordsList = new ArrayList<>(); try(Scanner sc = new Scanner(new File(args[0]))) { while(sc.hasNext()) { String word = sc.next().toLowerCase(); wordsList.add(word); } Iterator it = wordsList.iterator(); while(it.hasNext()) System.out.print(it.next()+" "); System.out.println(""); } catch(FileNotFoundException ex) { System.out.println("Unable to open file \""+args[0]+"\""); } } } Μια παραλλαγή του παραπάνω κώδικα είναι - αντί για τη μέθοδο ''add'' να χρησιμοποιήσετε ένα ListIterator προκειμένου να βάλετε τα στοιχεία στη λίστα - αντί να εκτυπώσετε τα στοιχεία της λίστας από την αρχή προς το τέλος να τα εκτυπώσετε από το τέλος προς την αρχή, όπως παρακάτω: import java.util.*; import java.io.*; public class ListExample { public static void main(String []args) { List wordsList = new ArrayList<>(); try(Scanner sc = new Scanner(new File(args[0]))) { ListIterator it = wordsList.listIterator(); while(sc.hasNext()) { String word = sc.next().toLowerCase(); it.add(word); } it = wordsList.listIterator(wordsList.size()); while(it.hasPrevious()) System.out.print(it.previous()+" "); System.out.println(""); } catch(FileNotFoundException ex) { System.out.println("Unable to open file \""+args[0]+"\""); } } } Το κείμενο το οποίο δίνεται ως όρισμα στο πρόγραμμα δίνεται παρακάτω. Call me Ishmael Some years ago never mind how long precisely having little or no money in my purse and nothing particular to interest me on shore I thought I would sail about a little and see the watery part of the world It is a way I have of driving off the spleen and regulating the circulation Whenever I find myself growing grim about the mouth whenever it is a damp drizzly November in my soul whenever I find myself involuntarily pausing before coffin warehouses and bringing up the rear of every funeral I meet and especially whenever my hypos get such an upper hand of me that it requires a strong moral principle to prevent me from deliberately stepping into the street and methodically knocking people hats off then I account it high time to get to sea as soon as I can This is my substitute for pistol and ball With a philosophical flourish Cato throws himself upon his sword I quietly take to the ship There is nothing surprising in this If they but knew it almost all men in their degree some time or other cherish very nearly the same feelings towards the ocean with me There now is your insular city of the Manhattoes belted round by wharves as Indian isles by coral reefs commerce surrounds it with her surf Right and left the streets take you waterward Its extreme downtown is the battery where that noble mole is washed by waves and cooled by breezes which a few hours previous were out of sight of land Look at the crowds of water gazers there Circumambulate the city of a dreamy Sabbath afternoon Go from Corlears Hook to Coenties Slip and from thence by Whitehall northward What do you see Posted like silent sentinels all around the town stand thousands upon thousands of mortal men fixed in ocean reveries Some leaning against the spiles some seated upon the pier heads some looking over the bulwarks of ships from China some high aloft in the rigging as if striving to get a still better seaward peep But these are all landsmen of week days pent up in lath and plaster tied to counters nailed to benches clinched to desks How then is this Are the green fields gone What do they here But look here come more crowds pacing straight for the water and seemingly bound for a dive Strange Nothing will content them but the extremest limit of the land loitering under the shady lee of yonder warehouses will not suffice No They must get just as nigh the water as they possibly can without falling in And there they stand miles of them leagues Inlanders all they come from lanes and alleys streets and avenues north east south and west Yet here they all unite Tell me does the magnetic virtue of the needles of the compasses of all those ships attract them thither Once more Say you are in the country in some high land of lakes Take almost any path you please and ten to one it carries you down in a dale and leaves you there by a pool in the stream There is magic in it Let the most absent minded of men be plunged in his deepest reveries stand that man on his legs set his feet a going and he will infallibly lead you to water if water there be in all that region Should you ever be athirst in the great American desert try this experiment if your caravan happen to be supplied with a metaphysical professor Yes as every one knows meditation and water are wedded for ever But here is an artist He desires to paint you the dreamiest shadiest quietest most enchanting bit of romantic landscape in all the valley of the Saco What is the chief element he employs There stand his trees each with a hollow trunk as if a hermit and a crucifix were within and here sleeps his meadow and there sleep his cattle and up from yonder cottage goes a sleepy smoke Deep into distant woodlands winds a mazy way reaching to overlapping spurs of mountains bathed in their hill side blue But though the picture lies thus tranced and though this pine tree shakes down its sighs like leaves upon this shepherd head yet all were vain unless the shepherd eye were fixed upon the magic stream before him Go visit the Prairies in June when for scores on scores of miles you wade knee deep among Tiger lilies what is the one charm wanting Water there is not a drop of water there Were Niagara but a cataract of sand would you travel your thousand miles to see it Why did the poor poet of Tennessee upon suddenly receiving two handfuls of silver deliberate whether to buy him a coat which he sadly needed or invest his money in a pedestrian trip to Rockaway Beach Why is almost every robust healthy boy with a robust healthy soul in him at some time or other crazy to go to sea Why upon your first voyage as a passenger did you yourself feel such a mystical vibration when first told that you and your ship were now out of sight of land Why did the old Persians hold the sea holy Why did the Greeks give it a separate deity and own brother of Jove Surely all this is not without meaning And still deeper the meaning of that story of Narcissus who because he could not grasp the tormenting mild image he saw in the fountain plunged into it and was drowned But that same image we ourselves see in all rivers and oceans It is the image of the ungraspable phantom of life and this is the key to it all Now when I say that I am in the habit of going to sea whenever I begin to grow hazy about the eyes and begin to be over conscious of my lungs I do not mean to have it inferred that I ever go to sea as a passenger For to go as a passenger you must needs have a purse and a purse is but a rag unless you have something in it Besides passengers get sea sick grow quarrelsome don’t sleep of nights do not enjoy themselves much as a general thing no I never go as a passenger nor though I am something of a salt do I ever go to sea as a Commodore or a Captain or a Cook I abandon the glory and distinction of such offices to those who like them For my part I abominate all honorable respectable toils trials and tribulations of every kind whatsoever It is quite as much as I can do to take care of myself without taking care of ships barques brigs schooners and what not And as for going as cook though I confess there is considerable glory in that a cook being a sort of officer on ship board yet somehow I never fancied broiling fowls though once broiled judiciously buttered and judgmatically salted and peppered there is no one who will speak more respectfully not to say reverentially of a broiled fowl than I will It is out of the idolatrous dotings of the old Egyptians upon broiled ibis and roasted river horse that you see the mummies of those creatures in their huge bake houses the pyramids No when I go to sea I go as a simple sailor right before the mast plumb down into the forecastle aloft there to the royal mast head True they rather order me about some and make me jump from spar to spar like a grasshopper in a May meadow And at first this sort of thing is unpleasant enough It touches one sense of honor particularly if you come of an old established family in the land the Van Rensselaers or Randolphs or Hardicanutes And more than all if just previous to putting your hand into the tar pot you have been lording it as a country schoolmaster making the tallest boys stand in awe of you The transition is a keen one I assure you from a schoolmaster to a sailor and requires a strong decoction of Seneca and the Stoics to enable you to grin and bear it But even this wears off in time What of it if some old hunks of a sea captain orders me to get a broom and sweep down the decks What does that indignity amount to weighed I mean in the scales of the New Testament Do you think the archangel Gabriel thinks anything the less of me because I promptly and respectfully obey that old hunks in that particular instance Who a slave Tell me that Well then however the old sea captains may order me about however they may thump and punch me about I have the satisfaction of knowing that it is all right that everybody else is one way or other served in much the same way either in a physical or metaphysical point of view that is and so the universal thump is passed round and all hands should rub each other shoulder blades and be content Again I always go to sea as a sailor because they make a point of paying me for my trouble whereas they never pay passengers a single penny that I ever heard of On the contrary passengers themselves must pay And there is all the difference in the world between paying and being paid The act of paying is perhaps the most uncomfortable infliction that the two orchard thieves entailed upon us But being paid what will compare with it The urbane activity with which a man receives money is really marvellous considering that we so earnestly believe money to be the root of all earthly ills and that on no account can a monied man enter heaven Ah how cheerfully we consign ourselves to perdition |Προηγούμενο: [[:java:jfc_intf_set | Interface java.util.Set ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:jfc_intf_map| Interface java.util.Map ]] |