java:jfc_intf_list

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
java:jfc_intf_list [2015/03/16 18:17]
gthanos created
java:jfc_intf_list [2020/03/16 20:00]
gthanos [Υλοποιήσεις]
Line 1: Line 1:
 ====== java.util.List ====== ====== java.util.List ======
  
-Το interface //List// υλοποιεί μία διπλά διασυνδεδεμένη λίστα. Η βασικές διαφορές σε σχέση με το //Set// interface είναι ότι ένα αντικείμενο μπορεί να εμφανίζεται περισσότερες από μία φορές μέσα στη λίστα. Επίσης η σειρά των αντικειμένων στη λίστα διατηρείται και είναι η σειρά με την οποία εισήχθησαν (όλα τα νέα αντικείμενα εισάγονται στο τέλος της λίστας).+Το 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//. Το interface //List// ορίζει τις εξής επιπλέον μεθόδους σε σχέση με το interface //Collection//.
Line 9: Line 9:
   * **[[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#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#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 που επιτρέπει την διάτρεξη της λίστας και προς τις δύο κατευθύνσεις. Δείτε το παράδειγμα που ακολουθεί και διατρέχεται η λίστα από το τέλος προς την αρχή.
 +
 +<code java>
 +for (ListIterator<Type> it = list.listIterator(list.size()); it.hasPrevious(); ) {
 +    Type t = it.previous();
 +    ...
 +}
 +</code>
 +
 +===== Υλοποιήσεις =====
 +
 +Υπάρχουν δύο βασικές κλάσεις που υλοποιούν το συγκεκριμένο 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.
 +
 +===== Παράδειγμα =====
 +
 +Το παράδειγμα που ακολουθεί διαβάζει από ένα αρχείο κειμένου μια σειρά από λέξεις με τη βοήθεια της κλάσης [[https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html|java.util.Scanner]]. Τα γράμματα κάθε λέξης μετατρέπονται σε πεζά πριν αποθηκευτούν στη λίστα.
 +
 +<code java 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]+"\"");
 +    }
 +  }
 +}
 +</code>
 +
 +Μια παραλλαγή του παραπάνω κώδικα είναι 
 +  - αντί για τη μέθοδο ''add'' να χρησιμοποιήσετε ένα ListIterator προκειμένου να βάλετε τα στοιχεία στη λίστα
 +  - αντί να εκτυπώσετε τα στοιχεία της λίστας από την αρχή προς το τέλος να τα εκτυπώσετε από το τέλος προς την αρχή, όπως παρακάτω:
 +
 +<code java 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()-1);
 +      while(it.hasPrev())
 +        System.out.print(it.prev()+" ");
 +      System.out.println("");
 +    }
 +    catch(FileNotFoundException ex) {
 +      System.out.println("Unable to open file \""+args[0]+"\"");
 +    }
 +  }
 +}
 +
 +</code>
 +
 +
 +
 +|Προηγούμενο: [[:java:jfc_intf_set | Interface java.util.Set ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:jfc_intf_map| Interface java.util.Map ]] |
 +
 +
  
  
java/jfc_intf_list.txt · Last modified: 2021/05/22 03:21 (external edit)