|
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 [Υλοποιήσεις] |
| ====== 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//. |
| * **[[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 ]] | |
| | |
| | |
| |
| |