בתרגול הקודם כללי הרשאות (Visibility modifiers) בהורשה – Public – Protected – private חוקי גישה לשדות ושיטות בהורשה ב -Java מחלקות אבסטרקטיות –המילה השמורה.

Slides:



Advertisements
Similar presentations
Object Oriented 33 MCSD DORON AMIR
Advertisements

תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
Interface ממשקים 1. ראינו כי ניתן לשמור אובייקטים במערכים באותו אופן כמו משתנים רגילים. ננסה כעת לראות כיצד למיין מערך של אובייקטים מסוג מסוים. נשתמש.
COMP 103 Linked Stack and Linked Queue.
טבלאות סמלים נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
רשימה מקושרת Linked Lists. דוגמא STRING איך עושים Dim x as String בלי לדעת מראש את הגודל !
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
Unit 11 1 Unit 11: Data Structures H We explore some simple techniques for organizing and managing information H This unit focuses on: Abstract Data Types.
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
אוניברסיטת בן גוריון - מבוא למדעי המחשב 1 תרגול מספר 10  ממשקים o כללים בסיסיים o מימוש מספר ממשקים o דוגמת ממשק כחוזה  הורשה o כללים בסיסיים o דריסה.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
שימוש במערך דינמי : ArrayList. מאפיינים חשובים בכל LIST יכולת להכניס מידע בלי תלות בטיפוס יכולת למחוק מידע יכולת להוסיף מידע פונקציות נוספות ( מיון, חיפוש.
תהליכים  מהו תהליך ?  מבני הנתונים לניהול תהליכים.  החלפת הקשר.  ניהול תהליכים ע " י מערכת ההפעלה.
Stacks and Queues. Stack ADT סוג של מערך מוגבל מהר מאוד ולוקחים מעט זכרון שימוש ב LIFO – LIFO (Last In, First Out) lists. –אפשר להוסיף רק בסוף הרשימה.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
יחס סדר חלקי.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
תרגול 12: ומחסניתIteratorרשימה מקושרת, תור, 1. רשימה מקושרת (Linked List) רשימה מקושרת הינה קבוצה סדורה של אובייקטים, כאשר כל אובייקט ברשימה מכיל הצבעה.
מבוא מורחב למדעי המחשב בשפת Scheme תרגול 10. אג'נדה שאלות מבחינות חזרה על מימוש stream אפשרי 2.
1 Lecture 26 Abstract Data Types – IV Overview  The List ADT  Implementing Stacks as Linked List  Linked List Implementation of Queues .  Preview:
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
ומחסניתIteratorרשימה מקושרת, תור,
המשך תכנות מונחה עצמים 1. היום בתרגול  הורשה  שיטות מיוחדות  פולימורפיזם 2.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
LinkedList Many slides from Horstmann modified by Dr V.
Methods public class Demonstrate { public static void main (String argv[]) { public static void main (String argv[]) { int script = 6, acting = 9, directing.
1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable.
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8 Control (Part II)
תרגול 12: Iterator מחסנית תור 1. מחסנית (stack) מחסנית (stack) היא מבנה נתונים שמזכיר מחסנית של רובה : האיבר שנכנס ראשון למחסנית יוצא ממנה אחרון (LIFO.
מחסנית ותור Stacks and Queues. מחסנית Stack מחסנית - Stack ADT סוג של מערך מוגבל מהיר מאוד ותופס מעט זיכרון שימוש ב LIFO – LIFO (Last In, First Out)
Practice session 6 Sequence Operations Partial Evaluation Lazy Lists.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים פולימורפיזם מתקדם ממשקים בג ' אווה 1.
הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות מתקדם
מחסנית ותור Stacks and Queues. מחסנית Stack מחסנית - Stack ADT סוג של מערך מוגבל מהיר מאוד ותופס מעט זיכרון שימוש ב LIFO – LIFO (Last In, First Out)
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
מבנה נתונים או טיפוס נתונים מופשט חלק ב – פעולות על רשימה הוכן ע " י ולרי פקר דצמבר 2015.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
Iterators. Iterator  An iterator is any object that allows one to step through each element in a list (or, more generally, some collection).
Java Reflection הוכן על-ידי אחמד ג'בארה
האוניברסיטה העברית בירושלים
Programming Arrays.
מבני נתונים רשימה מקושרת, מחסנית ותור
Tirgul 12 Trees 1.
Formal Specifications for Complex Systems (236368) Tutorial #1
מחלקות classes.
מבוא למדעי המחשב סיבוכיות.
מבנה נתונים ואלגוריתמים
תירגול 14: מבני נתונים דינאמיים
ממשקים - interfaces איך לאפשר "הורשה מרובה".
Marina Kogan Sadetsky –
הרצאה 21: Queue, Iterator & Iterable
בניית מחסנית סטטית Static Stack Implementation מורים מובילים תשע"ה
תכנות מכוון עצמים ושפת JAVA
הכמסה – Encapsulation עקרון ההכמסה
מבוא לתכנות מונחה עצמים Object Oriented Programming
Linked Lists [AJ 15].
מחסנית ותור Stacks and Queues.
מבוא לתכנות ב- Java תרגול 10 - רשימות מקושרות.
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

בתרגול הקודם כללי הרשאות (Visibility modifiers) בהורשה – Public – Protected – private חוקי גישה לשדות ושיטות בהורשה ב -Java מחלקות אבסטרקטיות –המילה השמורה abstract –שיטות אבסטרקטיות ( ללא מימוש ) –לא ניתן ליצור מופעים –השוואה בין ממשקים למחלקות אבסטרקטיות 1

תרגול 12 – ( קצת על ) מבני נתונים רשימה מקושרת Iterator תור מחסנית 2

רשימה מקושרת (Linked List) רשימה מקושרת הינה קבוצה סדורה של אובייקטים, כאשר כל אובייקט ברשימה מכיל הצבעה לאובייקט הבא. כל אובייקט מהווה חוליה בשרשרת : - קודקוד ברשימה הינו מסוג Link - כל הרשימה נקראת LinkedList null Data Next Link 3

מחלקה שמייצגת חוליה Link Data Next Link 4 public class Link { private Object data; // המידע שהחוליה מכילה private Link next; // (nullמצביע לחוליה הבאה ברשימה (או ל- public Link(Object data, Link next) { this.data = data; this.next = next; } public Link(Object data) { this(data, null); } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Link getNext() { return next; } public void setNext(Link next) { this.next = next; }

מחלקה שמייצגת רשימה מקושרת LinkedList public class LinkedList { private Link first; public LinkedList (){ first = null; } public LinkedList (Object data){ first = new Link(data, null); }... } 5

מחלקה שמייצגת רשימה מקושרת LinkedList null LinkedList datanext datanext datanext first 6

public boolean isEmpty() { return (first == null); } נוסיף למחלקה את השיטה : נרצה לדעת האם הרשימה שלנו מכילה איברים או לא ? אז נוסיף את השיטה הבוליאנית isEmpty() אשר תחזיר true אם הרשימה ריקה, ו -false אחרת. 7

נוסיף למחלקה את השיטה : 8 public void addLast(Object data) { Link newLink = new Link(data, null); if (isEmpty()) { first = newLink; } else { Link linkPointer = first; while (linkPointer.getNext() != null) { linkPointer = linkPointer.getNext(); } linkPointer.setNext(newLink); } איך ניתן לבצע הכנסת איבר לסוף הרשימה במספר קבוע של פעולות? רוצים רמז? נניח שמותר לנו להוסיף שדה. איזה שדה נוסיף? לאיזו מחלקה?

דוגמת שימוש lst.addLast( "World!"); LinkedList lst = new LinkedList(); lst.addLast( "Hello" ); lst.addLast( "Great" ); null datanextdatanextdata next LinkedList first null 9

נוסיף שיטה אשר מסירה את החוליה הראשונה ברשימה ומחזירה את האובייקט המוצבע על ידה. public Object removeFirst(){ Object ans; if (isEmpty()) { ans = null; } else { ans = first.getData(); first = first.getNext(); } return ans; } נוסיף למחלקה גם את השיטה : 10

המשך דוגמת שימוש lst.removeFirst(); null datanextdatanextdatanext LinkedList first "Hello""Great""World!" 11

המשך דוגמת שימוש lst.removeFirst(); null datanextdata next LinkedList first lst.removeFirst(); "Great""World!" 12

המשך דוגמת שימוש lst.removeFirst(); null data next LinkedList first lst.removeFirst(); "World!" 13

המשך דוגמת שימוש lst.removeFirst(); null LinkedList first lst.removeFirst(); 14

נוסיף למחלקה LinkedList את השיטה getMiddle : 1.getMiddle - מהו האיבר האמצעי ברשימה ? - רעיונות לפתרון ? 15

getMiddle 16 public Object getMiddle(){ Object ans; if(isEmpty()) { ans = null; } else { Link current = first; Link jumper = first; while( (jumper != null) && (jumper.getNext() != null) ){ current = current.getNext(); jumper = jumper.getNext().getNext(); } ans = current.getData(); } return ans; } &&

… while( (jumper != null) && (jumper.getNext() != null) ){ current = current.getNext(); jumper = jumper.getNext().getNext(); } ans = current.getData(); … 17

נוסיף למחלקה LinkedList את השיטה containsCircles : 2. containsCircles - האם יש מעגלים ברשימה ? - האם עלולים להיווצר מעגלים שכאלה ? - חידה : כמה מעגלים לכל היותר יכולים להיות ברשימה מקושרת ? 18

19 public boolean containsCircles() { boolean ans; if(isEmpty()) { ans = false; } else { Link current = first; Link jumper = first; boolean start = true; while(jumper != null && ( current != jumper || start) ){ start = false; current = current.getNext(); jumper = jumper.getNext(); if (jumper != null) jumper = jumper.getNext(); } ans = (jumper != null); } return ans; }

while(jumper != null && ( current != jumper || start) ){ start = false; current = current.getNext(); jumper = jumper.getNext(); if (jumper != null) jumper = jumper.getNext(); } 20

while(jumper != null && ( current != jumper || start) ){ start = false; current = current.getNext(); jumper = jumper.getNext(); if (jumper != null) jumper = jumper.getNext(); } 21

while(jumper != null && ( current != jumper || start) ){ start = false; current = current.getNext(); jumper = jumper.getNext(); if (jumper != null) jumper = jumper.getNext(); } 22

while(jumper != null && ( current != jumper || start) ){ start = false; current = current.getNext(); jumper = jumper.getNext(); if (jumper != null) jumper = jumper.getNext(); } 23

while(jumper != null && ( current != jumper || start) ){ start = false; current = current.getNext(); jumper = jumper.getNext(); if (jumper != null) jumper = jumper.getNext(); } 24

while(jumper != null && ( current != jumper || start) ){ start = false; current = current.getNext(); jumper = jumper.getNext(); if (jumper != null) jumper = jumper.getNext(); } 25

Array vs. Linked List מערך יתרונות : –גישה מהירה –שימוש פשוט וקל חסרונות : –גודל קבוע שלא יכול להשתנות בזמן ריצה –הכנסת איבר חדש במקום כלשהו מצריכה השקעה רשימה מקושרת יתרונות : –גמישות ( בהינתן איבר, הוספתו \ מחיקתו בזמן קבוע ) –גודל הרשימה לא צריך להיות ידוע מראש חסרונות : –גישה " לא מהירה " למיקום ספציפי – יותר מסובך מאשר מערך 26

Iterator 27

Iterator מידע ונתונים (data) הדרושים לתכנית מחשב נשמרים בתוך מבנה נתונים (data structure). על מבנה נתונים יש צורך לבצע מספר פעולות, כמו הכנסת נתונים והוצאת נתונים. אחת הדרכים להוציא נתונים היא לעבור על אוסף הנתונים פריט - מידע אחר פריט - מידע. האחריות על מבנה הנתונים היא של המתכנת שלו, ברצוננו להקל על המשתמש במבנה הנתונים ככל הניתן. 28

Iterator נרצה שתכונה זו תהיה משותפת למבני נתונים רבים, למשל לרשימה, שראינו זה עתה. לכן נגדיר ממשק, שאותו כל מבנה נתונים יממש. נרצה להגיד שמבנה נתונים הוא ניתן למעבר פריט - אחר - פריט, ובאנגלית : Iterable. ב -JAVA קיים הממשק : 29 public interface Iterable { /** * Returns an iterator over a set of elements. * an Iterator. */ Iterator iterator(); }

Iterator יהיה לנו אובייקט שיעזור בתהליך. אובייקט זה יעבור על אוסף הנתונים פריט אחר פריט, לפי סדר מסוים, ובאנגלית :Iterator. ב -JAVA מוגדר ממשק לעבודה עם אובייקט כזה : 30 public interface Iterator { boolean hasNext(); Object next(); void remove(); }

public interface Iterator { /** * Returns true if the iteration has more elements. true if the iterator has more elements. */ boolean hasNext(); /** * Returns the next element in the iteration. the next element in the iteration. NoSuchElementException iteration has no more elements. */ Object next(); /** * Removes from the underlying collection the last element returned by the * iterator (optional operation) UnsupportedOperationException if the "remove" * operation is not supported by this Iterator. * IllegalStateException if the "next" method has not * yet been called, or the "remove" method has already * been called after the last call to the "next" * method. */ void remove(); } 31

שימוש ב -Iterator בהמשך נראה כיצד להפוך את המחלקה LinkedList כך שתתמוך ב -Iterator, כרגע נניח שהמחלקה כבר תומכת בו, ועל סמך זאת נעשה שימוש ב -Iterator שמתקבל מהשיטה iterator(), שמובטחת לנו מכיוון ש -LinkedList מממשת את Iterable. 32 public static void main(String[] args) { LinkedList lst = new LinkedList(); lst.addLast("Shnitsels"); lst.addLast(“Are"); lst.addLast("Tasty"); Iterator it = lst.iterator(); while (it.hasNext()) { Object currentData = it.next(); System.out.print(currentData); if (it.hasNext()) System.out.print(", "); } System.out.println(); }

ListIterator currentLink דוגמת שימוש datanextdatanext LinkedList first 33 datanext null while (it.hasNext()) { Object currentData = it.next(); System.out.print(currentData); if (it.hasNext()) System.out.print(", "); } System.out.println(); Shnitsels,Are,Tasty

מימוש ה -Iterator עבור LinkedList public class ListIterator implements Iterator { private Link currentLink; //constructors public ListIterator(Link first) { currentLink = first; } public boolean hasNext() { return ( currentLink != null ); } //methods public Object next() { if (!hasNext()) { throw new NoSuchElementException(); } Object data = currentLink.getData(); currentLink = currentLink.getNext(); return data; } public void remove() { throw new UnsupportedOperationException(); } 34

עתה נראה כיצד נתמוך ב -Iterator במחלקה LinkedList: 35 public interface Iterable { /** * Returns an iterator over a set of elements. * an Iterator. */ Iterator iterator(); } מימוש ה -Iterable במחלקה LinkedList

כל מה שנותר לעשות הוא לממש את השיטה iterator() של הממשק Iterable ב LinkedList: public class LinkedList implements Iterable{ private Link first; public LinkedList (){ first = null; } … // All methods remain the same public Iterator iterator(){ return new ListIterator(first); } 36

הערות Iterator מניח שלא נעשה שינוי באוסף עליו הוא עובר במהלך המעבר. אם נעשה שינוי – האיטרטור איננו במצב חוקי ואין הבטחה לפעולה תקינה שלו. השיטה ()next מחוייבת לזרוק את החריגה NoSuchElementException במידה ואין יותר אלמנטים באוסף. ( אם לפני כל קריאה ל -next() נוודא ש -hasNext() החזיר true אז לא נתקל בחריגה זו ). החריגה : UnsupportedOperationException נזרקת כאשר אנו מחוייבים להכריז שיטה מסויימת ( למשל כי היא חלק מממשק ) במחלקה שלנו, אך אנו לא תומכים בשיטה זו. לכן בגוף השיטה נזרוק את החריגה. 37

תור - Queue תור (Queue) הוא מבנה נתונים המזכיר תור של בני אדם : האיבר שנכנס ראשון לתור - יוצא ממנו ראשון. ניתן לראות כקופסה סגורה בעלת 2 פתחים : פתח הכנסה ופתח יציאה. איבר שנכנס ראשון יוצא ראשון FIFO (FIFO - First In First Out). שימושים : ניהל תהליכים ע " י מערכת ההפעלה, ניהול תור בבית מרקחת,... 38

public interface Queue{ /** * isEmpty - checks if the queue is empty or not. true if the queue is empty */ public boolean isEmpty(); /** * dequeue - removes an object from the head of the queue. * (FIFO order) the next object in the queue. */ public Object dequeue(); /** * enqueue - inserts an object into the queue. o the object to be enqueued. */ public void enqueue(Object o); } 39

מימוש תור ע " י רשימה מקושרת public class QueueAsList implements Queue { private LinkedList lst; public QueueAsList() {lst = new LinkedList(); } public boolean isEmpty() { return lst.isEmpty(); } public Object dequeue() { return lst.removeFirst(); } public void enqueue(Object o) { lst.addLast(o); } 40

דוגמה נרצה לקלוט מהמשתמש מספר מחרוזות ורק כאשר הוא יסיים להקליד ( למשל ע " י זיהוי שורה ריקה ) נדפיס בחזרה את כל המחרוזות בדיוק לפי סדר ההכנסה. 41

המשך import java.util.Scanner; … public static void main(String args[]) { Scanner sc = new Scanner(System.in); Queue q = new QueueAsList(); System.out.println("Insert few lines … "); while (sc.hasNextLine()) { String line = sc.nextLine(); q.enqueue( line ); } System.out.println("Printing all the lines back! "); while (!q.isEmpty()) { System.out.println(q.dequeue()); } 42

דוגמה נוספת "'WIMBELDON" : רוצים לבצע טורניר טניס 43

המשך נרצה לממש את השיטה: public static Player simulateTournament(LinkedList playersList) אשר מקבלת רשימה של שחקנים ומבצעת סימולציה של טורניר טניס באופן הבא: * בשלב הראשון השחקנים מתחלקים לזוגות. * מכל זוג עולה המנצח לשלב הבא ושוב השחקנים מתחלקים לזוגות עד שנותר שחקן בודד שהוא המנצח (טורניר knock-out). 44

נממש את השיטה ע " י שימוש בתור – כאשר נאתחל אותו באברי הרשימה, וכל עוד התור מכיל יותר מאיבר אחד נשלוף שני שחקנים מהתור, " ניתן " להם לשחק ואת המנצח נכניס לסוף התור ( עבר לסיבוב הבא ). המשך 45

שחקן 1 שחקן 2 שחקן 3 שחקן 4 שלב 1: המשך שחקן 1 שחקן 2 שחקן 3 שחקן 4 46

שחקן 1 שחקן 2 שחקן 3 שחקן 4 שחקן 2 שחקן 4 שלב 1: שלב 2: המשך שחקן 2 שחקן 4 47 שחקן 3

שחקן 1 שחקן 2 שחקן 3 שחקן 4 שחקן 2 שחקן 4 שלב 1: שלב 2: המשך שחקן 2 שחקן 4 48

שחקן 1 שחקן 2 שחקן 3 שחקן 4 שחקן 2 שחקן 4 שחקן 2 שחקן 4 שלב 1: שלב 2: שלב 3 ( המנצח ): המשך שחקן 2 49

public static Player simulateTournament( LinkedList playersList) { Queue q = new QueueAsList(); Iterator it = playersList.iterator(); Player winner = null; while (it.hasNext()) { q.enqueue( it.next() ); } while ( ! q.isEmpty() ) { Player first = (Player)q.dequeue(); if (q.isEmpty()) { winner = first; } else { Player second = (Player)q.dequeue(); Player matchWinner = getWinner(first,second); q.enqueue( matchWinner ); } return winner; } 50

מחסנית (stack) מחסנית (stack) היא מבנה נתונים שמזכיר מחסנית של רובה : האיבר שנכנס ראשון למחסנית יוצא ממנה אחרון (LIFO - Last In First Out). ניתן לראות במחסנית קופסה סגורה בעלת פתח יחיד, שדרכו נעשות פעולות הדחיפה והשליפה. הטיפול דרך פתח יחיד יוצר מצב שבו איבר שנכנס אחרון יוצא ראשון - LIFO. מחסנית היא שימושית כאשר יש צורך לשמור נתונים בסדר מסוים ולשלוף אותם בסדר הפוך. 51

public interface Stack { /** * push - adds an element to the stack. o the elemented to be inserted to the stack. */ public void push (Object o); /** * pop - removes an element form the stack (LIFO order). the element from the top of the stack. */ public Object pop (); /** * isEmpty - checks if the stack is empty or not. true if there is no more elements in the stack. */ public boolean isEmpty(); } ממשק 52

השיטה copy מקבלת כארגומנט מחסנית s ומחזירה העתק של המחסנית s כאשר יש לשמור על סדר האיברים במחסנית המועתקת וב-s זהה. דוגמה – העתק מחסנית public static Stack copy(Stack s) { Stack temp = new StackImpl(); Stack ans = new StackImpl(); while (!s.isEmpty()) { temp.push(s.pop()); } while (!temp.isEmpty()) { Object o = temp.pop(); ans.push(o); s.push(o); } return ans; } 53

השיטה filter לסינון איברים העונים על תנאי מתוך כלל איברי הרשימה. עתה נתכנן שיטה לסינון איברי הרשימה. נשאיר רק איברים העונים על תנאי כלשהו. אך מהו התנאי ? קשה לקבוע תנאי שכן רשימה היא מבנה נתונים כללי היכול להכיל איברים מסוגים שונים. 54

השיטה filter לסינון איברים העונים על תנאי מתוך כלל איברי הרשימה. אז מה נעשה ? נגדיר ממשק Filter המכיל שיטה אחת והיא accept, המקבלת אובייקט ומחליטה האם הוא עובר את הסינון או לא. ראשית נגדיר את הממשק Filter: 55

public interface Filter { /** * accept – defines the filtration criterion. o the object to be examined. true if the object should not be * filtered out. */ public boolean accept(Object o); } אנו נממש Filter פשוט עבור המחלקה String, המשאיר רק את המחרוזות הלא ריקות : public class EmptyStringFilter implements Filter { public boolean accept(Object o) { boolean ans = false; if (o instanceof String) { String s = (String) o; ans = s.length() > 0; } return ans; } } 56

היינו רוצים לממש שיטה במחלקה LinkedList, המקבלת מסנן ומחזירה רשימה מסוננת. כך שנוכל להשתמש בה באופן הבא: LinkedList lst = new LinkedList(); lst.addLast( "Hello" ); lst.addLast( "" ); lst.addLast( "Great" ); lst.addLast( "" ); lst.addLast( "World" ); LinkedList ans = lst.filter(new EmptyStringFilter()); //ans = ["Hello", "Great", "World" ] 57

public LinkedList filter(Filter filter) { LinkedList filteredList = new LinkedList() ; Iterator it = this.iterator(); while (it.hasNext()) { Object data = it.next(); if(filter.accept(data)) { filteredList.addLast(data) ; } return filteredList; } כל שנותר הוא לממש את אלגוריתם הסינון ב-LinkedList: האלגוריתם מקבל כקלט מסנן, ומחזיר רשימה חדשה שתכיל את כל אברי הרשימה הנוכחית שעברו את המסנן. 58

LinkedList lst = new LinkedList(); lst.addLast( "Hello" ); lst.addLast( "" ); lst.addLast( "Great" ); lst.addLast( "" ); lst.addLast( "World" ); LinkedList ans = lst.filter(new EmptyStringFilter()); //ans = ["Hello", "Great", "World" ] 59