This is an old revision of the document!
Το interface List υλοποιεί μία διπλά διασυνδεδεμένη λίστα. Η βασικές διαφορές σε σχέση με το Set interface είναι ότι ένα αντικείμενο μπορεί να εμφανίζεται περισσότερες από μία φορές μέσα στη λίστα. Επίσης η σειρά των αντικειμένων στη λίστα διατηρείται και είναι η σειρά με την οποία εισήχθησαν (όλα τα νέα αντικείμενα εισάγονται στο τέλος της λίστας). Μπορείτε να σκεφτείτε την λίστα σαν ένα πίνακα, όπου έχετε πρόσβαση στο i-στο στοιχείο του.
Το interface List ορίζει τις εξής επιπλέον μεθόδους σε σχέση με το interface Collection.
for (ListIterator<Type> it = list.listIterator(list.size()); it.hasPrevious(); ) { Type t = it.previous(); ... }
Υπάρχουν δύο βασικές κλάσεις που υλοποιούν το συγκεκριμένο interface, ArrayList και LinkedList. Κάθε μία υλοποίηση έχει θετικά και αρνητικά σημεία. Συνήθως χρησιμοποιούμε την ArrayList, παρακάτω γίνεται σύντομη απαρίθμηση των θετικών και αρνητικών στοιχείων των δύο υλοποιήσεων.
Με δεδομένο ότι έχουμε ένα αρχείο λεξικό που περιέχει όλες τις λέξεις του αγγλικού αλφαβήτου θέλουμε να φτιάξουμε ένα πρόγραμμα που να διαβάζει λέξεις από το πληκτρολόγιο και να μας εκτυπώνει εάν αυτές βρίσκονται ή όχι μέσα στο λεξικό που έχουμε δώσει στο πρόγραμμα.
Αρχικά καλούμαστε να φτιάξουμε μία λίστα με όλες τις λέξεις του αρχείου λεξικού. Στη συνέχεια για κάθε λέξη που διαβάζουμε εξετάζουμε εάν βρίσκεται μέσα στην λίστα. Θα επιτύχουμε το ίδιο αποτέλεσμα α) χρησιμοποιώντας ένα iterator για να διατρέξουμε τη λίστα και β) χρησιμοποιώντας την μέθοδο contains που μας δίνει το interface Collection.
import java.util.*; import java.io.*; public class SearchDictionary { public SearchDictionary(File dictionary) { List<String> myDictionary = new ArrayList<>(); try (FileInputStream fin = new FileInputStream(dictionary) ) { Scanner fsc = new Scanner(fin); while( fsc.hasNext() ) { myDictionary.add(fsc.next()); } System.err.println("Finished reading dictionary!"); Scanner isc = new Scanner(System.in); String word; do { System.out.print("Enter word to search for: "); word = isc.next(); Iterator<String> it = myDictionary.iterator(); boolean wordFound = false; while( it.hasNext() ) { String entry = it.next(); if( entry.equals(word) ) { wordFound = true; break; } } if( wordFound ) System.out.println("Word found!"); else System.out.println("Word missing!"); } while( !word.equals("#quit") ); } catch(IOException ex) { ex.printStackTrace(); } } public static void main(String [] args) { SearchDictionary lu = new SearchDictionary(new File("largedict.txt")); } }
import java.util.*; import java.io.*; public class SearchDictionary { public SearchDictionary(File dictionary) { List<String> myDictionary = new ArrayList<>(); try (FileInputStream fin = new FileInputStream(dictionary) ) { Scanner fsc = new Scanner(fin); while( fsc.hasNext() ) { myDictionary.add(fsc.next()); } System.err.println("Finished reading dictionary!"); Scanner isc = new Scanner(System.in); String word; do { System.out.print("Enter word to search for: "); word = isc.next(); if( myDictionary.contains(word) ) System.out.println("Word found!"); else System.out.println("Word missing!"); } while( !word.equals("#quit") ); } catch(IOException ex) { ex.printStackTrace(); } } public static void main(String [] args) { SearchDictionary lu = new SearchDictionary(new File("largedict.txt")); } }
Αντί για java.util.ArrayList θα μπορούσατε να χρησιμοποιήσετε java.util.LinkedList με το ίδιο ακριβώς αποτέλεσμα.