java:inner_classes
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:inner_classes [2017/02/03 13:59] – gthanos | java:inner_classes [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Μη στατικές εμφωλευμένες κλάσεις ====== | ====== Μη στατικές εμφωλευμένες κλάσεις ====== | ||
- | Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (inner classes) αποτελούν την γενικότερη περίπτωση εμφώλευσης μίας κλάσης μέσα σε μία άλλη κλάση. | + | Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (inner classes) αποτελούν την γενικότερη περίπτωση εμφώλευσης μίας κλάσης μέσα σε μία άλλη κλάση. |
+ | Η λίστα θα χρειαστεί να έχει τις βοηθητικές κλάσεις | ||
+ | - την κλάση που περιγράφει τον κόμβο της λίστας και | ||
+ | - μία κλάση τύπου // | ||
+ | Οι δύο παραπάνω κλάσεις εξυπηρετεί να δηλωθούν ως εσωτερικές κλάσεις αποκρύπτοντας την ύπαρξη τους. Ο χρήστης της κλάσης απαιτείται μόνο να γνωρίζει την κλάση της λίστας και πως μπορεί να διαχειριστεί ένα αντικείμενο τύπου | ||
- | <code java DataStructure.java> | + | Δείτε τον παρακάτω κώδικα που την υλοποιεί. |
- | public class DataStructure | + | |
+ | <code java LinkedList.java> | ||
+ | /* A linked list with sentinels at head and tail. | ||
+ | */ | ||
+ | public class LinkedList< | ||
+ | private Node< | ||
+ | int size; | ||
+ | |||
+ | public LinkedList() { | ||
+ | head = new Node<> | ||
+ | tail = new Node<> | ||
+ | head.setNext(tail); | ||
+ | size = 0; | ||
+ | } | ||
| | ||
- | | + | |
- | private | + | private |
- | private | + | private |
| | ||
- | | + | |
- | // fill the array with ascending integer values | + | next = nxt; |
- | for (int i = 0; i < SIZE; i++) { | + | |
- | | + | |
} | } | ||
+ | | ||
+ | public Node< | ||
+ | public void setNext(Node< | ||
+ | public Node< | ||
+ | public void setPrev(Node< | ||
+ | public E getElement() { return e; } | ||
+ | public void setElement(E elem) { e = elem; } | ||
} | } | ||
| | ||
- | | + | |
+ | Node< | ||
| | ||
- | | + | |
- | | + | |
- | | + | } |
- | | + | public boolean hasNext() { |
+ | if(curr.getNext() != tail) | ||
+ | return true; | ||
+ | return false; | ||
+ | | ||
+ | public E next() { | ||
+ | curr = curr.getNext(); | ||
+ | return curr.getElement(); | ||
+ | } | ||
+ | public void remove() { | ||
+ | | ||
+ | curr.getNext().setPrev(curr.getPrev()); | ||
+ | curr = curr.getPrev(); | ||
} | } | ||
- | System.out.println(); | ||
} | } | ||
| | ||
- | interface | + | |
+ | return new Iterator< | ||
+ | } | ||
+ | |||
+ | // append in the end | ||
+ | public boolean add(E elem) { | ||
+ | Node< | ||
+ | tail.getPrev().setNext(plus); | ||
+ | tail.setPrev(plus); | ||
+ | size++; | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | public boolean add(int index, E elem) { | ||
+ | if(index> | ||
+ | return false; | ||
+ | Node< | ||
+ | for(int i=0; curr != tail && i<index; i++) { | ||
+ | curr = curr.next; | ||
+ | } | ||
+ | Node< | ||
+ | curr.prev.next = plus; | ||
+ | curr.prev = plus; | ||
+ | size++; | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | public boolean contains(E elem) { | ||
+ | Iterator< | ||
+ | while(it.hasNext()) { | ||
+ | E e = it.next(); | ||
+ | if( e.equals(elem) ) | ||
+ | return true; | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | public int indexOf(E elem) { | ||
+ | Iterator< | ||
+ | int index = -1; | ||
+ | while(it.hasNext()) { | ||
+ | E e = it.next(); | ||
+ | index++; | ||
+ | if( e.equals(elem) ) | ||
+ | return index; | ||
+ | } | ||
+ | return -1; | ||
+ | } | ||
+ | |||
+ | int size() { | ||
+ | return size; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Το παρακάτω πρόγραμμα επιχειρεί να δημιουργήσει μία λίστα με 20 τυχαίους αριθμούς και στη συνέχεια να τους εκτυπώσει χρησιμοποιώντας τον Iterator της λίστας. Παρατηρήστε ότι σε κανένα σημείου του προγράμματος δεν αποκαλύπτεται η ύπαρξη των εσωτερικών κλάσεων //Node// και // | ||
+ | |||
+ | <code java LinkedListUsage.java> | ||
+ | import java.util.*; | ||
- | // Inner class implements the DataStructureIterator interface, | + | public |
- | | + | |
+ | public static final int RANGE = 8 * SIZE; | ||
| | ||
- | | + | |
+ | Iterator< | ||
| | ||
- | // Start stepping through the array from the beginning | + | // Print list |
- | | + | |
- | + | | |
- | public boolean | + | |
- | | + | |
- | // Check if the current element is the last in the array | + | |
- | return | + | |
- | } | + | |
- | + | ||
- | public Integer | + | |
- | + | ||
- | // Record a value of an even index of the array | + | |
- | Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]); | + | |
- | + | ||
- | // Get the next even element | + | |
- | nextIndex += 2; | + | |
- | return retValue; | + | |
} | } | ||
- | | + | |
- | public void remove() { } | + | |
} | } | ||
| | ||
- | public static void main(String | + | public static void main(String[] |
+ | Random rand = new Random( new Date().getTime()); | ||
+ | LinkedList< | ||
+ | for(int i=0; i<SIZE; i++) { | ||
+ | int value = rand.nextInt(RANGE); | ||
+ | int pos = rand.nextInt(list.size()+1); | ||
+ | System.out.format(" | ||
+ | list.add(pos, | ||
+ | print(list); | ||
+ | } | ||
+ | print(list); | ||
+ | |||
+ | // Remove all elements less than RANGE/2 | ||
+ | System.out.println(" | ||
+ | Iterator< | ||
+ | while(it.hasNext()) { | ||
+ | int value = it.next(); | ||
+ | // | ||
+ | if(value < RANGE/2) { | ||
+ | // | ||
+ | it.remove(); | ||
+ | } | ||
+ | } | ||
+ | print(list); | ||
| | ||
- | // Fill the array with integer values and print out only | ||
- | // values of even indices | ||
- | DataStructure ds = new DataStructure(); | ||
- | ds.printEven(); | ||
} | } | ||
} | } | ||
+ | |||
</ | </ | ||
- | <WRAP todo center 80% round> | + | <WRAP todo center 80% round> |
</ | </ | ||
- | |Προηγούμενο: | + | |Προηγούμενο: |
java/inner_classes.1486130381.txt.gz · Last modified: 2017/02/03 13:59 (external edit)