User Tools

Site Tools


java:jfc_intf_list

java.util.List

Το interface List υλοποιεί μία διπλά διασυνδεδεμένη λίστα. Η βασικές διαφορές σε σχέση με το Set interface είναι ότι ένα αντικείμενο μπορεί να εμφανίζεται περισσότερες από μία φορές μέσα στη λίστα. Επίσης η σειρά των αντικειμένων στη λίστα διατηρείται και είναι η σειρά με την οποία εισήχθησαν (όλα τα νέα αντικείμενα εισάγονται στο τέλος της λίστας). Μπορείτε να σκεφτείτε την λίστα σαν ένα πίνακα, όπου έχετε πρόσβαση στο i-στο στοιχείο του.

Το interface List ορίζει τις εξής επιπλέον μεθόδους σε σχέση με το interface Collection.

  • get(int index) - Επιστρέφει την τιμή στην θέση index.
  • indexOf(Object o) - Επιστρέφει την 1η θέση του αντικειμένου στην λίστα ή -1 αν δεν περιέχεται το αντικείμενο.
  • lastIndexOf(Object o) - Επιστρέφει την τελευταία θέση του αντικειμένου στην λίστα ή -1 αν δεν περιέχεται το αντικείμενο.
  • subList(int fromIndex, int toIndex) - Επιστρέφει μία υπολίστα της αρχικής λίστας, από fromIndex έως toIndex.
  • set(int index, E element) - Αντικαθιστά το αντικείμενο στην θέση index με το element επιστρέφοντας το αντικείμενο που ήταν αρχικά αποθηκευμένο. Εάν το index που δίνεται είναι εκτός των ορίων της λίστας throws IndexOutOfBoundsException.
  • Η μέθοδος listIterator() επιστρέφει ένα ListIterator object που επιτρέπει την διάτρεξη της λίστας και προς τις δύο κατευθύνσεις. Δείτε το παράδειγμα που ακολουθεί και διατρέχεται η λίστα από το τέλος προς την αρχή.
for (ListIterator<Type> it = list.listIterator(list.size()); it.hasPrevious(); ) {
    Type t = it.previous();
    ...
}

Υλοποιήσεις

Υπάρχουν δύο βασικές κλάσεις που υλοποιούν το συγκεκριμένο interface, ArrayList και LinkedList. Κάθε μία υλοποίηση έχει θετικά και αρνητικά σημεία. Συνήθως χρησιμοποιούμε την ArrayList, παρακάτω γίνεται σύντομη απαρίθμηση των θετικών και αρνητικών στοιχείων των δύο υλοποιήσεων.

  • Χρόνος εντοπισμού ενός στοιχείου με βάση τη θέση του: Η ArrayList έχει σταθερό χρόνο αναζήτησης, ενώ η LinkedList έχει γραμμικό χρόνο αναζήτησης.
  • Εισαγωγή στοιχείου στο τέλος: Και οι δύο έχουν τον ίδιο χρόνο εισαγωγής.
  • Εισαγωγή στοιχείου στην αρχή ή στην μέση: Η ArrayList έχει γραμμικό χρόνο εισαγωγής ως προς το μέγεθος της λίστας, ενώ η LinkedList έχει σταθερό χρόνο.
  • Η LinkedList έχει τις επιπλέον μεθόδους addFirst, getFirst, removeFirst, addLast, getLast και removeLast.
  • Η LinkedList υλοποιεί το Queue interface.

Παράδειγμα 1o

Το παράδειγμα που ακολουθεί δημιουργεί μία λίστα από αντικείμενα τύπου Student, εισάγοντας στοιχεία στην αρχή, στο τέλος και ενδιάμεσα μέσα στη λίστα. Στη συνέχεια, η λίστα εκτυπώνεται με τρεις διαφορετικούς τρόπους:

  • με χρήση enhanced for loop.
  • με χρήση ListIterator διατρέχοντας τη λίστα και προς τις δύο κατευθύνσεις.
  • με χρήση for και λήψη των περιεχομένων της λίστας με βάση τη θέση τους μέσω της συνάρτησης get.
SudentList.java
import java.util.*;
import java.lang.*;
 
public class StudentList {
 
  public static void iterateList1(List<Student> students) {
    for(Student st: students) {
      System.out.println(st.toString());
    }
  }
 
  public static void iterateList2(List<Student> students) {
    ListIterator<Student> 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<Student> students) {
    for(int i=0; i<students.size(); i++) {
      System.out.println(students.get(i).toString());
    }
  }
 
  public static void main(String args[]) {
    List<Student> students;
    students = new LinkedList<Student>();
    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

Το παράδειγμα που ακολουθεί διαβάζει από ένα αρχείο κειμένου μια σειρά από λέξεις με τη βοήθεια της κλάσης java.util.Scanner. Τα γράμματα κάθε λέξης μετατρέπονται σε πεζά πριν αποθηκευτούν στη λίστα.

ListExample.java
import java.util.*;
import java.io.*;
 
public class ListExample {
 
  public static void main(String []args) {
 
    List<String> 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]+"\"");
    }
  }
}

Μια παραλλαγή του παραπάνω κώδικα είναι

  1. αντί για τη μέθοδο add να χρησιμοποιήσετε ένα ListIterator προκειμένου να βάλετε τα στοιχεία στη λίστα
  2. αντί να εκτυπώσετε τα στοιχεία της λίστας από την αρχή προς το τέλος να τα εκτυπώσετε από το τέλος προς την αρχή, όπως παρακάτω:
ListExample.java
import java.util.*;
import java.io.*;
 
public class ListExample {
 
  public static void main(String []args) {
 
    List<String> wordsList = new ArrayList<>();
    try(Scanner sc = new Scanner(new File(args[0]))) {
      ListIterator<String> 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]+"\"");
    }
  }
}

Το κείμενο το οποίο δίνεται ως όρισμα στο πρόγραμμα δίνεται παρακάτω.

sample.txt
 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_list.txt · Last modified: 2021/05/22 03:21 (external edit)