This is an old revision of the document!
Table of Contents
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.
Παράδειγμα
Το παράδειγμα που ακολουθεί διαβάζει από ένα αρχείο κειμένου μια σειρά από λέξεις με τη βοήθεια της κλάσης 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]+"\""); } } }
Μια παραλλαγή του παραπάνω κώδικα είναι
- αντί για τη μέθοδο
add
να χρησιμοποιήσετε ένα ListIterator προκειμένου να βάλετε τα στοιχεία στη λίστα - αντί να εκτυπώσετε τα στοιχεία της λίστας από την αρχή προς το τέλος να τα εκτυπώσετε από το τέλος προς την αρχή, όπως παρακάτω:
- 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]+"\""); } } }
Προηγούμενο: Interface java.util.Set | Περιεχόμενα | Επόμενο: Interface java.util.Map |