תוכנה 1 תרגול מספר 13

Similar documents
תוכנה 1 בשפת Java נושאים שונים בהורשה רובי בוים ומתי שמרת בית הספר למדעי המחשב אוניברסיטת תל אביב

תוכנה 1 תרגול מספר 13

ממשק משתמש גרפי בעזרת SWT

מבוא למדעי המחשב תרגול 8 רשימה משורשרת כללית, Comparator

הנכות 1 םוכיס לוגרת 13 1

הנכות 1 םוכיס לוגרת 13 1

הנכות 1 םוכיס לוגרת 13 1

תוכנה 1. תרגול מספר 11: Static vs. Dynamic Binding מחלקות מקוננות Nested Classes

Algorithms. Intro2CS week 5

מערכים שעור מס. 4 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

הנכות 1 םוכיס לוגרת 14 1

משתנים שעור מס. 2 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

תוכנה 1 סמסטר א' תשע"א

תוכנה 1. תרגול מספר 11: Static vs. Dynamic Binding מחלקות מקוננות Nested Classes בית הספר למדעי המחשב אוניברסיטת תל אביב

תוכנה 1 ומחלקות פנימיות

מבוא לתכנות ב- JAVA תרגול 7

תזכורת: עץבינארי מבוא למדעי המחשב הרצאה 24: עצי חיפוש בינאריים

מבוא למדעי המחשב תרגול 13: עצים בינאריים

תוכנה 1 * לא בהכרח בסדר הזה

הנכות 1 תואיגש םע תודדומתהו תואלול,םי : כרעמ 2 לוגרת

ASP.Net Web API.

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

הנכות 1 תואיגש םע תודדומתהו תואלול,םיכרעמ : לו 2 גרת

תוכנה 1 תרגול 2: מערכים ומבני בקרה

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

תוכנה 1 * לא בהכרח בסדר הזה

תוכנה 1 תרגול 2: מערכים, מבני בקרה ושגיאות

הקלחמ ה תמרב ת ונ וכ ת (static members ) יליזרב דהוא Java תפשב ם דקת מ תונכת ביבא ל ת תטיסרבינוא

מבוא לתכנות ב- JAVA מעבדה 2

ספרית התבניות הסטנדרטית (STL) כתיבת אלגוריתמים גנריים מצביעים חכמים. .vector. list iterator נכיר תחילה את האוסף הפשוט ביותר בספריה

Practical Session - Heap

תרגול 4 פונקציות. מבנה של פונקציה: public static <return value type> <function name> (<arg1 type> <arg1>, <arg2 type> <arg2>, ) { <function body> }

רזח יליגרתו םי יראני ב ם

Computer Programming A תרגול 9

Tutorial 10. Introduction to C++ שימו

שאלה 1 מהו הפלט של התוכנית הבאה:

JAVA V Assertions Java, winter semester

מבוא לתכנות בשפת C. Tzachi (Isaac) Rosen

תוכנה 1 טיפוסי השפה טיפוסים לא פרימיטיביים הטיפוסים הפרימיטיביים מחרוזות המרה למספרים תרגול 2: טיפוסי שפה, מחרוזות, מערכים ושגיאות

Introduction to Programming in C תרגול 8

The class Object. Lecture CS1122 Summer 2008

תרגול 3 מערכים ופונקציות

JAVA V Source files Java, winter semester

תרגול מספר 3: מערכים

תוכנה 1 תרגול מספר 10: תרגיל חזרה חברת הייטק בית הספר למדעי המחשב אוניברסיטת תל אביב

Amortized Analysis, Union-Find,

Programming in C תרגול 8

מבוא למדעי המחשב תירגול 2: מבוא למדעי המחשב מ' - תירגול 2

מבוא למדעי המחשב תירגול 3:

קורס תכנות בשיעור הקודם למדנו על רקורסיה שיעור שישי: מערכים פונקציה רקורסיבית שאלה חישוב נוסחאות רקורסיביות בשפת C

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

ת ונכת סרוק תורשוקמ תומישר :יעישת רועיש 1

תוכנה 1 * לא בהכרח בסדר הזה

תוכנה 1 תרגול מספר 10: תרגיל חברת הייטק בית הספר למדעי המחשב אוניברסיטת תל אביב

תרגול 12. Standard Template Library כתיבת אלגוריתמים גנריים מצביעים חכמים

תור שימושים בעולם התוכנה

היצביט ומ - ןוכית ת וי נבת

מצליחה. 1. int fork-bomb() 2. { 3. fork(); 4. fork() && fork() fork(); 5. fork(); printf("bla\n"); 8. return 0; 9. }

Simple Web Service. namespace MyService { public class Service1 : System.Web.Services.WebService {

ב ה צ ל ח ה! אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ה תשרי תשע"ח 15/10/17 שמות המורים: ציון סיקסיק מיועד לתלמידי : א'

$ gcc check.c. $ a.out. $ gcc check.c -o check. $ check. $ gcc -Wall check.c -o check. #include <stdio.h>

כתבו קוד ב- 3 קבצי ה hpp (כתבו כהערה את שם הקובץ מעל) כך שהקוד יהיה תקין ובסגנון טוב. אין חובה

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Loop through Arrays. Array Creation and Initialization

Engineering Programming A

סכום (סדרת ערכים) אחרת - דוגמא: סכום-ספרות (num) אם < 10 num החזר 1 או אם = 0 = num החזר 0 public static int numofdigits (int num)

תוכנה 1 מבני נתונים גנריים

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Array Creation and Initialization. Loop through Arrays

תוכנה 1 3 תרגול מס' מערכים ומבני בקרה

Communication Networks ( ) / Spring 2011 The Blavatnik School of Computer Science, Tel-Aviv University. Allon Wagner

תכנות מונחה עצמים משחקים תשע"ו

- מבחן. - 4 עבודות ב- JAVA. הגשה בזוגות דרך ה- System Submission

קורס תכנות שיעור שישי: מחרוזות, מצביעים

תרגול 6 רקורסיה ותכנות מונחה עצמים

תכנות מתקדם בשפת C משתנים

<exp> ::= <define> <cexp> <define> ::= ( define <var-decl> <cexp> ) / DefExp(var:VarDecl, val:cexp)

1.1. Annotations History Lesson - C/C++

מחרוזות ב Java ותכנות מונחה בדיקות )Test Driven Development(

Exams questions examples

קורס תכנות כתובות בזיכרון כתובות בזכרון מצביעים וכתובות מצביעים וכתובות שיעור שביעי: מבנים, הקצאת זיכרון דינאמית האופרטור &

Subtyping for behaviour?

Generics עזאם מרעי המחלקה למדעי המחשב אוניברסיטת בן-גוריון

Generics עזאם מרעי המחלקה למדעי המחשב אוניברסיטת בן-גוריון

מבוא לתכנות ב- JAVA מעבדה 4

Practical Session No. 14 Topological sort,amortized Analysis

Java Generics Java, summer semester

עקרונות שפות תכנות 2016 תרגול 8 Type Inference System. Substitution Interpreter.

מבוא לתכנות ב- JAVA תרגול 6

מבוא לתכנות מערכות מבחן מועד א' סמסטר חורף

דף הדרכה ליצירת שרת/ לקוח עם GUI

קורס תכנות רשימה מקושרת דוגמה: חיפוש מעבר על רשימה דוגמא: שחרור רשימה מקושרת דוגמא: הוספת אברים שלא בהתחלה

מבוא לתכנות ב- JAVA תרגול 5. Ipc161- practical session 5

שפת XML הפכה להיות נפוצה ובעלת תפקידים רבים, במיוחד עקב גמישותה הרבה:

מדעי המחשב 2 יחידות לימוד פתרון בחינת הבגרות פרק א. I x > a. פתרון 2: משפט switch

תרגול 3 מערכים ופונקציות

Nir Adar

קורס תכנות שיעור שני: שימוש במשתנים,

Programming for Engineers in Python

Programming for Engineers in Python

מבני נתונים תכנות מונחה עצמים מבני נתונים. מחלקות אבסטרקטיות חבילות packages סיכום הרשאות גישה wrappers ADT מערך דינמי מחסנית

תוכנה 1. תרגול מס' 3 עבודה עם מחרוזות )Strings( מתודות )Methods( העברת פרמטרים

Transcription:

1 2 תוכנה 1 תרגול מספר 13 ו- HashCode Equals עוד על טיפוסים מוכללים )Advanced Generics( ו- HASHCODE EQUALS חריגים )Exceptions( בית הספר למדעי המחשב אוניברסיטת תל אביב 1 3 4 package java.lang; תזכורת: המחלקה Object public class Object public final native Class<?> getclass(); מה יודפס? public class Name private String first, last; public native int hashcode(); public boolean equals(object obj) return (this == obj); protected native Object clone() throws CloneNotSupportedException; public String tostring() return getclass().getname() + "@" + Integer.toHexString(hashCode()); public static void main(string[] args) Name name1 = new Name("Mickey", "Mouse"); Name name2 = new Name("Mickey", "Mouse"); System.out.println(name1.equals(name2)); List<Name> names = new ArrayList<Name>(); names.add(name1); System.out.println(names.contains(name2)); 3 4 הבעיה רצינו השוואה לפי תוכן אבל לא דרסנו את equals מימוש ברירת המחדל הוא השוואה של מצביעים public class Object public boolean equals(object obj) return (this == obj); 5 החוזה של equals רפלקסיבי true יחזיר x.equals(x) סימטרי true יחזיר y.equals(x) אמ"מ true יחזיר x.equals(y) טרנזיטיבי אם x.equals(y) מחזיר true וגם y.equals(z) מחזיר true אז x.equals(z) עקבי סדרת קריאות ל x.equals(y) תחזיר true )או )false באופן עקבי אם מידע שדרוש לצורך ההשוואה לא השתנה השוואה ל null false תמיד תחזיר x.equals(null) 6 5 6 1

7 8 טעות נפוצה מתכון ל equals להגדיר את הפונקציה equals כך: public boolean equals(object obj) if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass()) return false; Name other = (Name) obj; 1. ודאו כי הארגומנט אינו מצביע לאובייקט הנוכחי return first.equals(other.first) && last.equals(other.last); זו אינה דריסה )overriding( אלא העמסה )overloading( שימוש ב @Override יתריע על הבעיה 2. ודאו כי הארגומנט אינו null 3. ודאו כי הארגומנט הוא מהטיפוס המתאים להשוואה 4. המירו את הארגומנט לטיפוס הנכון 5. לכל שדה "משמעותי", בידקו ששדה זה בארגומנט תואם לשדה באובייקט הנוכחי public boolean equals(name name) return first.equals(other.first) && last.equals(other.last); 7 8 אז הכל בסדר? public class Name @Override public equals(object obj) 9 כמעט עדיין יש בעיה בשימוש באוספים שמבוססים על Hash-Table public class Name @Override public equals(object obj) 10 public static void main(string[] args) Name name1 = new Name("Mickey", "Mouse"); Name name2 = new Name("Mickey", "Mouse"); System.out.println(name1.equals(name2)); יודפס true public static void main(string[] args) Name name1 = new Name("Mickey", "Mouse"); Name name2 = new Name("Mickey", "Mouse"); System.out.println(name1.equals(name2)); יודפס true List<Name> names = new ArrayList<Name>(); names.add(name1); System.out.println(names.contains(name2)); יודפס true Set<Name> names = new HashSet<Name>(); names.add(name1); System.out.println(names.contains(name2)); יודפס false 9 10 11 12 החוזה של hashcode hashcode ו equals חובה לדרוס את hashcode בכל מחלקה שדורסת את!equals עקביות מחזירה אותו ערך עבור כל הקריאות באותה ריצה, אלא אם השתנה מידע שבשימוש בהשוואת equals של המחלקה שוויון אם שני אובייקטים שווים לפי הגדרת equals אזי hashcode תחזיר ערך זהה עבורם חוסר שוויון אם שני אובייקטים אינם שווים לפי equals לא מובטח ש hashcode תחזיר ערכים שונים החזרת ערכים שונים יכולה לשפר ביצועים של מבני נתונים המבוססים על )HashMap ו HashSet )לדוגמא, hashing 11 12 2

13 14 מימוש hashcode @Override public int hashcode() return 31 * first.hashcode() + last.hashcode(); תמיכה באקליפס אקליפס תומך ביצירה אוטומטית )ומשולבת( של equals ו- hashcode בתפריט Source ניתן למצוא Generate hashcode() and equals() השתדלו לייצר hash כך שלאובייקטים שונים יהיה ערך hash שונה המימוש החוקי הגרוע ביותר )לעולם לא לממש כך!( @Override public int hashcode() return 42; 13 14 15 16 תזכורת: Generics Added to Java in version 5. (2004). עוד על טיפוסים מוכללים )ADVANCED GENERICS( Allows a class or method to operate on objects of various types while providing compile-time type-safety. Java Generics Tutorials - http://docs.oracle.com/javase/tutorial/java/generics/index. html Using Generics Before Generics (Raw types) A collection of type Object - Can be used to store any type List myintlist = new LinkedList(); - But the compiler can t enforce type safety myintlist.add(new Integer(0)); Integer x = (Integer) myintlist.iterator().next(); Using Generics: List<Integer> myintlist = new LinkedList<Integer>(); myintlist.add(new Integer(0)); Integer x = myintlist.iterator().next(); With Generics, we specify the type as parameter when we instantiate the generic class. Advantages: The generic class can still be used to hold different types every time it is instantiated (It is generic ) The compiler can use the specified type now enforce type safety. No need for casting from Object to the actual type. 17 תזכורת אם Sub הוא תת-טיפוס של Super אז המערך Sub[] הוא תת-טיפוס של המערך Super[] )זיכרו, Integer יורש מ )Number Integer[] intarr = new Integer[10]; Number[] numarr = intarr; numarr[0] = 2.3 // throws ArrayStoreException // type safety was compromised זה לא נכון לגבי טיפוסים גנריים! לדוגמא, List<Sub> אינו תת-טיפוס של List<Super> List<Integer> intlist = new ArrayList<Integer>(); List<Number> numlist = intlist; numlist.add(new Double(2.3)); // Adding a Double to an Integer list?! Integer I = numlist.get(0); // Double is returned?! // The compiler prevents the assignment on the second line in order to prevent the potential type-safety ambiguity on the grey lines 18 3

19 בעיה: כתיבת מתודה גנרית שתקבל אוסף של אובייקטים כלשהם Before Generics void printcollection(collection c) Iterator i = c.iterator(); for (k = 0; k < c.size(); k++) System.out.println(i.next()); Naïve attempt using Generics: This old version could be called with any kind of collection as a parameter But no type-safety void printcollection(collection<object> c) for (Object e : c) System.out.println(e); Less useful than the old version. This version can only take Collection<Object>, which is not a super-type of all kinds of collections! פתרון: Unbounded Wildcards אם כן, מהו טיפוס-האב של כל האוספים? Collection<?>? מייצג טיפוס לא ידוע כלשהו wildcard( )Unbounded void printcollection(collection<?> c) for (Object e : c) System.out.println(e); הערות: o האוסף שהמתודה מקבלת הינו גנרי על טיפוס כלשהו שאינו ידוע למתודה )למרות שנוצר בטרם שליחתו למתודה עם טיפוס גנרי מוגדר כלשהו(..Object בקוד המתודה, ניתן לשלוף איברים רק כשהם מטיפוס o o לא נוכל להוסיף איברים לאוסף c, כי לא ידוע לנו מה הטיפוס שלו. Collection<?> c = new ArrayList<String>(); c.add(new Object()); // Compile time error Unbounded Wildcard דוגמא נוספת: פונקציות הפועלות על מבנה ה- collection עצמו ( rotate, shuffle, ) במקרה זה, הטיפוס הגנרי של האוספים המתקבלים כפרמטרים למתודה לא משנה ולכן נרצה לקבל 2 אוספים שהינם גנריים על טיפוסים כלשהם )לא בהכרח מאותו סוג(: public static int numberofelementsincommon(set<?> s1, Set<?> s2) int result = 0; for (Object o : s1) if (s2.contains(o)) result++; return result; 21 Bounded Wildcards לעיתים נרצה להציב מגבלות על הטיפוסים אותם תקבל מתודה גנרית מסוימת. דוגמא: נניח נרצה לכתוב מתודה המקבלת אוסף צורות אותן עליה לצייר. נרצה שהמתודה תהיה גנרית ותוכל לקבל אוספים שהינם גנריים על טיפוסים שונים )ועל כן נשתמש ב- Wildcard (. אך נרצה שהמתודה תקבל רק אוספים של טיפוסים שיורשים מהמנשק Shape )ועל כן נחסום את ה- Wildcard (. 22 23 Bounded Wildcards - extends public abstract class Shape public abstract void draw(canvas c); public class Circle extends Shape private int x, y, radius; public void draw(canvas c) public class Rectangle extends Shape private int x, y, width, height; public void draw(canvas c) public void drawall(list<? extends Shape> shapes) for (Shape s: shapes) s.draw(this); Wildcard הכולל חסם עליון המתודה תוכל לקבל כפרמטר כל רשימה שהטיפוס הגנרי שלה הוא Shape או תת מחלקה שלו. כלומר: List<Rectangle> List<Shape>, List<Circle>, סוגי ה- Wildcards ישנם שלושה סוגים של :wildcards? קבוצת "כל הטיפוסים" או "טיפוס כלשהו"? extends T משפחת תתי הטיפוס של T )כולל T(? super T משפחת טיפוסי העל של T )כולל T(.1.2.3 4

כתיבת מחלקה גנרית תוך שימוש בפרמטר גנרי public class Node<T> private T data; private Node<T> next; public Node(T data, Node<T> next) this.data = data; this.next = next; כשנכתוב מחלקה גנרית, נכריז בראש המחלקה על הפרמטר שיציין את הטיפוס הגנרי )T במקרה זה(. public T getdata() return data; 25 לאחר מכן, נניח שכל מופע של הפרמטר בקוד המחלקה יוחלף בטיפוס האקטואלי שאיתו תאותחל המחלקה. למשל, במקרה הבא T יוחלף ב- Integer : Node<Integer> node = new Node<Integer>(5,null); כתיבת מחלקה גנרית תוך שימוש בפרמטר גנרי חסום public class Node<T extends Number> private T data; private Node<T> next; public Node(T data, Node<T> next) this.data = data; this.next = next; גם כאן ניתן להשתמש ב- extends וב- super כדי להגדיר חסמים על הטיפוסים ש- T יכול לקבל בעת יצירה של public T getdata() return data;.node 26 למשל, אם ברצוננו ליצור Node שמאחסן רק טיפוסים מספריים. 27 28 דוגמאות לירושה של מחלקות גנריות ניתן לכתוב מחלקות גנריות שיורשות ממחלקות גנריות יש לשים לב אילו פרמטרים גנריים צריך לציין בכל מחלקה דוגמאות: מאגר מחרוזות public class MyStringPool extends HashSet<String> Integer עם מפתח שהוא תמיד Map public interface IntegerKeyMap<V> extends Map<Integer, V> רשימה המאפשרת לשמור עבור כל איבר, בנוסף, ערך מטיפוס אחר P public interface PayloadList<E, P> extends List<E> רשימה דו-ממדית public class ArrayList2D<E> extends ArrayList<List<E>> הבדלים בין >T< ל->?< <?> Wildcard <T> Type Parameter משמעות מיקום הגדרה מיפוי יצירת עצמים עידכון אוספים <T> משמש כפרמטר טיפוס בעת הגדרת מחלקה גנרית. T יוחלף ע"י טיפוס קונקרטי בעת יצירת מופע של המחלקה הגנרית. צריך להצהיר על T בראש המחלקה )או מתודה במקרה של הגדרת מתודה גנרית( כל שימוש ב- T מתמפה לאותו הטיפוס )באותו המחלקה( <?> - כשנרצה להתייחס לטיפוס של ארגומנט שאינו ידוע אפשר להשתמש ב-? בכל מקום כל שימוש ב-? יכול להתמפות לטיפוס אחר אפשר ליצור עצמים עם פרמטר גנרי T, אי אפשר ליצור עצמים אלא רק מצביעים עם? למשל new ArrayList<T>() אפשר להוסיף עצמים לאוסף עם פרמטר T אי אפשר להוסיף עצמים לאוסף עם פרמטר? )כי איננו יודעים מה הטיפוס שלו( 29 30 תרגול נתונה לנו היררכיית המחלקות הבאה: תרגול שאלה: לאילו מן הבאים ניתן לעשות השמה ל- treelist? List<Tree> treelist = new ArrayList<>(); Plant Tree AppleTree List<Plant> l1 = treelist List<AppleTree> l2 = treelist ArrayList<Tree> l3 = treelist LinkedList<Tree> l4 = treelist Collection<Tree> l5 = treelist List<? extends Plant> l6 = treelist List<? extends Tree> l7 = treelist List<? super Tree> l8 = treelist List<? super Plant> l9 = treelist Collection<?> l10 = treelist ניתן לעשות המרה )casting( Plant Tree AppleTree 5

31 32 חריגים - Exceptions כאשר מתודה נתקלת בשגיאה בזמן ריצה ואינה יכולה לסיים את פעולתה הנורמלית, היא יכולה לזרוק חריג.)Exception( במקרה כזה המשך הקוד לא ירוץ )בדומה ל- return ( ולא יוחזר ערך מהפונקציה. כאשר פונקציה שקראנו לה זורקת חריג, ניתן לטפל בו או לזרוק אותו הלאה אל המתודה הקוראת. במקרה והמתודה זורקת את החריג הלאה, יש להצהיר עליו בחתימת המתודה, אלא אם מדובר בחריג היורש מ-.RuntimeException קצת על חריגים )EXCEPTIONS( 33 34 חריגים - Exceptions החריגים בג'אווה מיוצגים ע"י היררכיה של מחלקות כאשר החריג הכללי ביותר מיוצג ע"י המחלקה.Exception סוג נוסף של שגיאה Error על שגיאות מסוג זה אין צורך להצהיר, ולא ניתן לתפוס אותן דוגמא: התכנית הבאה קוראת מספרים מקובץ מסוים ושומרת אותם ברשימה. חריגים - דוגמא public class NumberList extends ArrayList<Integer> public static void main(string[] args) NumberList list = new NumberList(); try list.parsefrom("list.txt"); System.out.println("done: " + list); catch (FileNotFoundException e) System.out.println("FileNotFoundException"); catch (IOException InputMismatchException e) System.out.println("IOException or InputMismatchException"); בלוקי ה- catch מטפלים בשגיאות שנזרקות מתוך בלוק ה- try כל חריג מטופל בבלוק הראשון שיודע לטפל בטיפוס שלו או בהורה שלו החל מג'אווה 7 ניתן לטפל ביותר מטיפוס אחד באותו בלוק private void parsefrom(string filename) throws IOException חריגים public class NumberList extends ArrayList<Integer> public static void main(string[] args) private void parsefrom(string filename) throws IOException Scanner scanner = new Scanner(new FileInputStream(fileName)); try while (scanner.hasnext()) add(scanner.nextint()); finally System.out.print("Finally"); scanner.close(); if (size() < 3) throw new RuntimeException("Size is too small: " + size()); 35 הצהרה על זריקת חריג עבור כל חריג שדורש זאת. IOException כולל גם את,FileNotFoundException שיורש ממנו זורקת FileNotFoundException מה יודפס עבור הקלט זורקת InputMismatchException שיורש מ- RuntimeException finally ירוץ תמיד, בין אם מתקבלת שגיאה ובין אם לא זריקת חריג חדש )runtime( Finallydone: [134, 2342, 433] FinallyException in thread "main" NumberList$1: Size is too small: 2 at NumberList.parseFrom(NumberList.java:35) at NumberList.main(NumberList.java:14) FinallyIOException or InputMismatchException FileNotFoundException 36 list.txt מכיל 134 2342 433 list.txt מכיל 134 2342 134 2342 seven מכיל list.txt list.txt אינו קיים 6

37 זהו להיום 37 7