מבוא למדעי המחשב 2019 תרגול 9 חזרה על תכנות מונחה עצמים Part II
ראינו בהרצאה ממשקים Set Iterable Iterator
בתרגול היום חזרה על: ממשקים Iterator Iterable )iterator נראה: )set ממשק )מימוש SetAsLinkedList Iterator לרשימה משורשרת )מימוש ממשק פעולות על קבוצות )שימוש בממשק )set?
חלק א: ממשקים
שבוע שעבר )בתרגול( המחלקה SimplePair הגנרית הרחבות של מחלקה זו ומימוש מספר מרוכב בדרך ראינו: המחלקה Object הורשה גנריות Reference vs. Instance type אופרטור instanceof
תזכורת: המחלקה SimplePair<T> public class SimplePair<T> { private T first ; private T second ; public SimplePair (T first, T second) {... public SimplePair (SimplePair<T> other) {... public T getfirst () {... public T getsecond () {... public void setfirst (T value) {... public void setsecond (T value) {... public to () {... public boolean equals (Object other) { return other instanceof SimplePair<?> && first.equals(((simplepair<?>) other).getfirst ()) && second.equals(((simplepair<?>) other).getsecond ()) ;
מוטיבציה : השוואת SimplePair, ArrayPair בואו נניח שמישהו החליט לייצר מחלקה בשם.ArrayPair גם בה יש זוג איברים )בתוך מערך(. ויש לה את השיטות: getfirst(), getsecond() )שימו לב לא ראינו מימוש, אבל זה לא משנה!(
דוגמא : השוואת SimplePair, ArrayPair public static void main ([] args){ SimplePair<Double> pair1 = new SimplePair<> (1, 2); ArrayPair<Double> pair2 = new ArrayPair<> (1, 2); System.out.println(pair1.equals(pair2)) // False!!! Name Type Value pair1 pair2 SimplePair ArrayPair הפונקציה דורשת! SimplePair אבל היינו רוצים להשוות רק על בסיס התוכן, getfirst(), getsecond() כלומר: SimplePair first second getfirst () getsecond () void setfirst (..) void setsecond (..) : ArrayPair????? Double getfirst () Double getsecond () void setfirst (..) void setsecond (..) :
ממשקים - אינטואיציה היה טוב לו יכולנו לתמצת את הרעיון של מפרטי המימוש "זוג סדור" כל מה שמעניין אותנו ברעיון של זוג זה היכולת לבצע: getfirst(), getsecond() ולהתעלם
ממשקים אינטואיציה 2 Apple מתכננת להשיק מכשיר חדש הם לא מעוניינים לחשוף את המימוש בנוסף, רק עוד שנה הוא יצא בנתיים הם רוצים שמפתחים ברחבי העולם יכתבו אפליקציות )לדוגמא, וייז רוצים שהאפליקציה שלהם תהיה מוכנה לרוץ על המכשיר החדש ביום ההשקה( Apple מפרסמת ממשק, רשימה של פונקציות: gettextmessag makecall, getgpslocation, וכולי
ממשקים - עקרונות ממשק מייצג רעיון מופשט. הממשק )interface) הינו כלי למימוש עיקרון ההפרדה בין הכרזה למימוש. מבחינת המתכנת, ממשק הוא חוזה עבור השיטות שצריך למלא. ממשק קובע את הפונקציונאליות המשותפת לכל המחלקות המממשות אותו.
ממשקים הצהרה על ממשק: public interface <name> { <methods list> )public ללא מימושן ממשקים מתארים התנהגות )שיטות ממשקים אינם כוללים בנאים שכן אין דרך ליצר מופע אלא רק של מחלקה המממשת את הממשק אבל ממשק יכול להיות reference type של משתנה בדומה לשימוש במחלקות, המשתמש המימוש של השיטות השונות מחלקה אשר מממשת ממשק חייבת להכיל המופיעות בממשק )אובייקט( של ממשק )עוד בהמשך( בממשק אינו צריך להכיר את פרטי )לכל הפחות( את כל השיטות
ממשקים קוד הממשק /** * represent the ordered pair (first, second) * where first and second are of type T */ public interface Pair<T> { /** * get the first element of this pair */ public T getfirst () ; /** * get the second element of this pair */ public T getsecond () ; מהן ההתנהגויות המאפיינות זוג סדור? getfirst getsecond setfirst setsecond /** * change the first element of this pair */ public void setfirst (T value) ; /** * change the second element of this pair */ public void setsecond (T value) ;
ממשקים קוד הממשק /** * represent the ordered pair (first, second) * where first and second are of type T */ public interface Pair<T> { ממשק בשם Pair עם פרמטר טיפוס T /** * get the first element of this pair */ T getfirst () ; /** * get the second element of this pair */ T getsecond () ; /** * change the first element of this pair */ void setfirst (T value) ; שיטות הממשק )מחייבות כל מחלקה שתממש את )Pair<T> /** * change the second element of this pair */ void setsecond (T value) ;
ממשקים קוד המחלקה public class SimplePair<T> implements Pair<T> { private T first ; private T second ; public SimplePair (T first, T second) {... public SimplePair (Pair<T> other) {... public T getfirst () {... public T getsecond () {... public void setfirst (T value) {... public void setsecond (T value) {... כיצד נכריז ש- SimplePair מממש את הממשק?Pair המילה השמורה implements המחלקה SimplePair "מתחייבת " לממש את השיטות המופיעות ב- Pair במידה ו"חסרות" שיטות שגיאת קומפילציה שיטות הממשק )חייבות להופיע( public to () {... public boolean equals (Object other) {... שיטות נוספות
Pair<T> שמממש את SimplePair<T> public class SimplePair<T> implements Pair<T> { private T first ; private T second ; public SimplePair (T first, T second) { this.first = first ; this.second = second ; public SimplePair (Pair<T> other) { this (other.getfirst(), other.getsecond()) ; public T getfirst() { return first ; public T getsecond() { return second ; public void setfirst(t value) { first = value ; public void setsecond(t value) { second = value ; public to () { return "(" + getfirst () + ", " + getsecond () + ")" ; public boolean equals (Object other) { return other instanceof Pair<?> && getfirst().equals(((pair<?>) other).getfirst ()) && getsecond().equals(((pair<?>) other).getsecond());
דוגמת שימוש ב-< Pair<T public static void main ([] args){ Pair<Integer> pair1 = new SimplePair<>(1,2) ; Pair<Integer> pair2 = new ArrayPair<> (1,2) ; System.out.println(pair1); // (1, 2) System.out.println(pair2); // 1 : 2 System.out.println(pair2.getFirst()); // 1 System.out.println(pair1.equals(pair2)); // true Instance type first second SimplePair Integer Integer -> -> Type Name Value Pair pair1 Pair pair2 Reference type ArrayPair???? ArrayPair (Integer, Integer) ArrayPair (Pair<Integer>) Integer getfirst () Integer getsecond ()... SimplePair (Integer, Integer) SimplePair (Pair<Integer>) Integer getfirst () Integer getsecond ()...
חלק ב: SetAsLinkedList
תזכורת: ממשקים מההרצאה
תזכורת: ממשקים מההרצאה את זה נעשה היום:
תזכורת: הממשק Set<T> public interface Set<T> extends Iterable<T> { // test if element is in set public boolean contains(t element); // test if this is the empty set public boolean isempty(); public interface Iterable<T> { // get this object's iterator public Iterator<T> iterator () ; // number of elements in set public int size(); // add element to set if not already exists public void add(t element); // remove element from set if exists public void remove(t element);
מימוש של הממשק Set<T> עם רשימה מקושרת בהרצאה: מימוש של Set<T> באמצעות מערך דינמי כעת: מימוש של Set<T> באמצעות רשימה מקושרת למחלקה שלנו SetAsLinkedList<T> יהיה שדה אשר יכיל רשימה משורשרת של איברי הקבוצה כאשר נוסיף איברים לקבוצה נוודא כי אנו לא מוסיפים כפילויות
דוגמת שימוש ב- Set public static void main ([] args){ Set<Integer> set1 = new SetAsDynamicArray<> () ; set1.add (1); // set1 := {1 set1.add (2); // set1 := {1, 2 set1.add (3); // set1 := {1, 2, 3 System.out.println(set1); System.out.println(set1.contains (2)); System.out.println(set1.contains (-2)); // Set: {1, 2, 3 // true // false Set<Integer> set2 = new SetAsLinkedList<> () ; set2.add (-1) ; // set2 := {-1 set2.add (-2) ; // set2 := {-1, -2 set2.add (-3) ; // set2 := {-1, -2, -3 System.out.println(set2.contains (2)); System.out.println(set2.contains (-2)); SetAsDA List<Integer> elements boolean isempty () int size () boolean contains(integer element) void add (Integer element) : SetAsLL List<Integer> elements DynamicArray int size Object[] data int incrementsize boolean isempty () int size () Integer get(int index) Integer set(int index, Integer element) : LinkedList Link<Integer> first Name Type Value set1 Set set2 Set boolean isempty () int size () boolean contains(integer element) void add (Integer element) : boolean isempty () int size () Integer get(int index) Integer set(int index, Integer element) :
סיכום ביניים נרצה לייצר:.Set שיממש את המשק SetAsLinkedList 28
הפסקה 29
תזכורת: SetAsDynamicArray public class SetAsDynamicArray<T> implements Set<T> { private List<T> elements ; public SetAsDynamicArray() { elements = new DynamicArray<>(); public boolean isempty() { return elements.isempty(); public int size() { return elements.size(); public boolean contains(t element) { return elements.contains(element); public void add(t element) { if (! contains(element)) elements.add(element); public void remove(t element) { elements.remove(element); public Iterator<T> iterator() { return elements.iterator(); public to() { output = "Set: {"; Iterator<T> it= iterator (); while (it.hasnext()) { output = output+it.next()+", "; if (!isempty()) output = output.substring(0, output.length()-2); output = output+""; return output; שיטות הממשק )חייבות להופיע( public boolean equals(object other) { boolean isequal = true; if (!(other instanceof Set<?>)) isequal = false; else if (size()!= ((Set<?>)other).size()) isequal = false; else { Iterator<T> iter = iterator(); while (iter.hasnext() & isequal) isequal = (!((Set<Object>)other).contains(iter.next() )); return isequal;
המחלקה SetAsLinkedList<T> public class SetAsLinkedList<T> implements Set<T> { private List<T> elements ; public SetAsDynamicArray() { elements = new DynamicArray<>(); public boolean isempty() { return elements.isempty(); public int size() { return elements.size(); public boolean contains(t element) { return elements.contains(element); public void add(t element) { if (! contains(element)) elements.add(element); public void remove(t element) { elements.remove(element); public Iterator<T> iterator() { return elements.iterator(); public to() { output = "Set: {"; Iterator<T> it= iterator (); while (it.hasnext()) { output = output+it.next()+", "; if (!isempty()) output = output.substring(0, output.length()-2); output = output+""; return output; public boolean equals(object other) { if (!(other instanceof Set<?>)) return false ; Set<?> otherset = (Set<?>) other ; if (size ()!= otherset.size()) return false ; boolean isequal = true ; Iterator<T> it = iterator () ; while (it.hasnext() & isequal) isequal = otherset.contains(it.next()); return isequal ;
המחלקה SetAsLinkedList<T> public class SetAsLinkedList<T> implements Set<T> { private List<T> elements ; public SetAsLinkedList() { elements = new LinkedList<>(); public boolean isempty() { return elements.isempty(); public int size() { return elements.size(); public boolean contains(t element) { return elements.contains(element); public void add(t element) { if (! contains(element)) elements.add(element); public void remove(t element) { elements.remove(element); public Iterator<T> iterator() { return elements.iterator(); public to() { output = "Set: {"; Iterator<T> it= iterator (); while (it.hasnext()) { output = output+it.next()+", "; if (!isempty()) output = output.substring(0, output.length()-2); output = output+""; return output; public boolean equals(object other) { if (!(other instanceof Set<?>)) return false ; Set<?> otherset = (Set<?>) other ; if (size ()!= otherset.size()) return false ; boolean isequal = true ; Iterator<T> it = iterator () ; while (it.hasnext() & isequal) isequal = otherset.contains(it.next()); return isequal ;
תזכורת: הממשק Set<T> - חסר לנו איטרטור! public interface Set<T> extends Iterable<T> { // test if element is in set public boolean contains(t element); // test if this is the empty set public boolean isempty(); public interface Iterable<T> { // get this object's iterator public Iterator<T> iterator () ; // number of elements in set public int size(); // add element to set if not already exists public void add(t element); // remove element from set if exists public void remove(t element);
המחלקה SetAsLinkedList<T> public class SetAsLinkedList<T> implements Set<T> { private List<T> elements ; public SetAsLinkedList() { elements = new LinkedList<>(); public boolean isempty() { return elements.isempty(); public int size() { return elements.size(); public boolean contains(t element) { return elements.contains(element); public void add(t element) { if (! contains(element)) elements.add(element); public void remove(t element) { elements.remove(element); public Iterator<T> iterator() { return elements.iterator(); public to() { output = "Set: {"; Iterator<T> it= iterator (); while (it.hasnext()) { output = output+it.next()+", "; if (!isempty()) output = output.substring(0, output.length()-2); output = output+""; return output; public boolean equals(object other) { if (!(other instanceof Set<?>)) return false ; Set<T> otherset = (Set<T>) other ; if (size ()!= otherset.size()) return false ; boolean isequal = true ; Iterator<T> it = iterator () ; while (it.hasnext() & isequal) isequal = otherset.contains(it.next()); return isequal ;
סיכום ביניים 1. ממשק הוא "חוזה" המכיל רשימה של מטודות בהן המחלקה תומכת. 2. מימשנו את המחלקה,SetAsLinkedList שמממשת את הממשק Set שאלות על ממשקים? 35
חלק ג: הוספת Iterator LinkedList ל -
תזכורת: ממשקים מההרצאה
תזכורת: הממשק List<T> הוא Iterable public interface List<T> extends Iterable<T> { // Returns true if this list contains no elements. public boolean isempty(); // Returns the number of elements in this list. public int size(); // Returns true if this list contains the specified element. public boolean contains(t element); // Returns the element at the specified position in this list. public T get(int index); public interface Iterable<T> { // get this object's iterator public Iterator<T> iterator () ; // Replaces the element at the specified position in this // list with the specified element public T set(int index, T element); //Appends the specified element to the end of this list public boolean add(t element); public interface Iterator<T> { // test if iterator contain more values public boolean hasnext () ; //Inserts the specified element at the specified position //in this list public void add(int index, T element); //Removes the first occurrence of the specified element //from this list, if it is present public boolean remove(t element); // get the next value if exists // otherwise, throw NoSuchElement exception public T next () ;
תזכורת: המחלקה LinkedList<T> public class LinkedList <T> implements List<T> { private Link<T> first; public LinkedList() {... public LinkedList(List<T> mylist) {... public int size () {... public boolean isempty () {... public T get (int index) {... public boolean remove (Object toremove) {... public boolean contains (Object element) {... public T set (int index, T element) {... public void add (int index, T element) {... public boolean add (T element) {... public Iterator<T> iterator() {... public to () {... public boolean equals (Object other) {... public class Link <E> { private E data; private Link<E> next; public Link (E data, Link<E> next) {... public Link (E data) {... public Link<E> getnext () {... public void setnext (Link<E> next){... public E getdata () {... public E setdata (E data) {... public to() {... public class LinkedListIterator<T> implements Iterator<T> { : : public boolean hasnext () {... public T next () {...
תזכורת: ממשקים מההרצאה את זה נעשה כעת:
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ;
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ;
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; hello Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; hello world Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; hello world goodbye Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); hello world goodbye
LinkedList<T> עבור Iterator public class LinkedListIterator<T> implements Iterator<T> { private Link<T> current ; public LinkedListIterator (Link<T> start) { current = start ; public boolean hasnext() { return current!= null ; public T next() { if (!hasnext ()) throw new NoSuchElementException() ; T data = current.getdata() ; current = current.getnext() ; return data ;
השיטה iterator() ב-< LinkedList<T public class LinkedList <T> implements List<T> { : public Iterator<T> iterator() { return new LinkedListIterator<>(first) ; :
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); public class LinkedList <T> implements List<T> { : public Iterator<T> iterator() { return new LinkedListIterator<>(first) ; : hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); public class LinkedList <T> implements List<T> { : public Iterator<T> iterator() { return new LinkedListIterator<>(first) ; : public class LinkedListIterator<T> implements Iterator<T> { private Link<T> current ; public LinkedListIterator (Link<T> start) { current = start ; public boolean hasnext() { return current!= null ; public T next() { if (!hasnext ()) throw new NoSuchElementException() ; T data = current.getdata() ; current = current.getnext() ; return data ; hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); public class LinkedList <T> implements List<T> { : public Iterator<T> iterator() { return new LinkedListIterator<>(first) ; : public class LinkedListIterator<T> implements Iterator<T> { private Link<T> current ; public LinkedListIterator (Link<T> start) { current = start ; public boolean hasnext() { return current!= null ; public T next() { if (!hasnext ()) throw new NoSuchElementException() ; T data = current.getdata() ; current = current.getnext() ; return data ; hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); public class LinkedList <T> implements List<T> { : public Iterator<T> iterator() { return new LinkedListIterator<>(first) ; : public class LinkedListIterator<T> implements Iterator<T> { private Link<T> current ; public LinkedListIterator (Link<T> start) { current = start ; public boolean hasnext() { return current!= null ; public T next() { if (!hasnext ()) throw new NoSuchElementException() ; T data = current.getdata() ; current = current.getnext() ; return data ; hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); hello public class LinkedList <T> implements List<T> { : public Iterator<T> iterator() { return new LinkedListIterator<>(first) ; : public class LinkedListIterator<T> implements Iterator<T> { private Link<T> current ; public LinkedListIterator (Link<T> start) { current = start ; public boolean hasnext() { return current!= null ; public T next() { if (!hasnext ()) throw new NoSuchElementException() ; T data = current.getdata() ; current = current.getnext() ; return data ; hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); hello world public class LinkedList <T> implements List<T> { : public Iterator<T> iterator() { return new LinkedListIterator<>(first) ; : public class LinkedListIterator<T> implements Iterator<T> { private Link<T> current ; public LinkedListIterator (Link<T> start) { current = start ; public boolean hasnext() { return current!= null ; public T next() { if (!hasnext ()) throw new NoSuchElementException() ; T data = current.getdata() ; current = current.getnext() ; return data ; hello world goodbye
דוגמת שימוש ב- Iterator עבור LinkedList<T> public static void main ([] args){ List<> list = new LinkedList<>() ; list.add("hello") ; list.add("world") ; list.add("goodbye") ; Iterator<> it = list.iterator() ; while (it.hasnext()) System.out.print(it.next() + " "); System.out.println(); hello world goodbye public class LinkedList <T> implements List<T> { : public Iterator<T> iterator() { return new LinkedListIterator<>(first) ; : public class LinkedListIterator<T> implements Iterator<T> { private Link<T> current ; public LinkedListIterator (Link<T> start) { current = start ; public boolean hasnext() { return current!= null ; public T next() { if (!hasnext ()) throw new NoSuchElementException() ; T data = current.getdata() ; current = current.getnext() ; return data ; hello world goodbye
חלק ד: המחלקה הסטאטית Sets
פעולות נוספות על קבוצות )המחלקה )Sets public class Sets { // test if set1 subset of set2 public static <T> boolean subset (Set<T> set1, Set<T> set2) {... // return set1 union set2 public static <T> Set<T> union (Set<T> set1, Set<T> set2) {... // return the intersection of set1 and set2 public static <T> Set<T> intersection (Set<T> set1, Set<T> set2) {... // return the subtraction of set2 from set1 public static <T> Set<T> subtraction (Set<T> set1, Set<T> set2) {...
פעולות נוספות על קבוצות )המחלקה )Sets public class Sets { // test if set1 subset of set2 public static <T> boolean subset (Set<T> set1, Set<T> set2) {... // return set1 union set2 public static <T> Set<T> union (Set<T> set1, Set<T> set2) {... // return the intersection of set1 and set2 public static <T> Set<T> intersection (Set<T> set1, Set<T> set2) {... // return the subtraction of set2 from set1 public static <T> Set<T> subtraction (Set<T> set1, Set<T> set2) {... // return the product of set1 and set2 public static <T> Set<Pair<T>> product (Set<T> set1, Set<T> set2) {... // return the union of all sets in sets public static <T> Set<T> unionall (Set<Set<T>> sets) {...
שימוש בשיטה product public static void main ([] args){ Set<> streets = new SetAsDynamicArray<>() ; streets.add("street1"); streets.add("street2"); streets.add("street3"); System.out.println(streets); // Set: {... Set<> housenumbers = new SetAsLinkedList<>() ; housenumbers.add("1") ; housenumbers.add("2") ; housenumbers.add("3") ; housenumbers.add("4") ; System.out.println(houseNumbers); // Set: {... Set<Pair<>> streetsandnumbers = Sets.product (streets, housenumbers) ; System.out.println(streetsAndNumbers); // Set: {("Street1", "1"), ("Street1", "2"),..., ("Street3", "4")
מימוש השיטה product public class Sets {... public static <T> Set<Pair<T>> product (Set<T> set1, Set<T> set2) { Set<Pair<T>> prod = new SetAsLinkedList<>() ; Iterator<T> it1 = set1.iterator() ; while (it1.hasnext()) { T item1 = it1.next () ; Iterator <T> it2 = set2.iterator() ; while (it2.hasnext()) prod.add(new SimplePair<> (item1, it2.next())); return prod ;
שימוש בשיטה unionall public static void main ([] args){ Set<Integer> nums1 = new SetAsDynamicArray<>() ; nums1.add(0); nums1.add(1); nums1.add(3); Set<Integer> nums2 = new SetAsDynamicArray<>() ; nums1.add(1); nums1.add(3); nums1.add(5); Set<Integer> nums3 = new SetAsDynamicArray<>() ; nums1.add(0); nums1.add(2); nums1.add(4); Set<Set<Integer>> sets = new SetAsLinkedList<>() ; sets.add(nums1); sets.add(nums2); sets.add(nums3); Set<Integer> nums = Sets.unionAll(sets) ; System.out.println(nums); // Set: {0, 1, 2, 3, 4, 5
מימוש השיטה unionall public class Sets {... public static <T> Set<T> unionall (Set<Set<T>> sets) { Set<T> union = new SetAsLinkedList<>() ; Iterator<Set<T>> itsets = sets.iterator() ; while (itsets.hasnext()) { Iterator<T> it = itsets.next().iterator() ; while (it.hasnext()) union.add(it.next()); return union ;
סיכום ומשימות תרגלנו: ממשקים Iterator Iterable 4 משימות: עבודה קוויז