הקדמה comparator containers שימושיים iterator factory pattern trove הטמעה 89-210...

22
הההההComparator Containers ההההההההIterator Factory Pattern Trove ההההה89-210 - םםםםם םםםםם םםםםם3 Containers Containers ם םJava Java ההההה הההה'ה םםםםם םםםםם םםםםם םםםםם89-210 89-210 ההההה הההה3 הה"ה2009-2010

Upload: clementine-mcdonald

Post on 19-Jan-2016

238 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

ContainersContainers ב ב JavaJava

אליהו חלסצ'י

89-21089-210תכנות מתקדם תכנות מתקדם 3תרגול מספר

2009-2010תש"ע

Page 2: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

כלל חשוב לגבי השיעורים הבאים:

לא בזמן לא בזמן שאלות על שיעורי הבית – •התרגול.התרגול.

ניתן לשאול, כמובן, אחרי.•

Page 3: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

הקדמה.templates אין javaב •המפתחים החליטו שניתן לתכנת בצורה גנרית גם ללא תמיכה •

.templatesב , שיכולה לספק את רוב collectionsבמקום, ישנה קבוצה של •

.containersהצרכים שלנו ב .++C של STLקבוצה זו לא נבנתה לשם יעילות כמו ה • וכך היה ניתן Objectבעבר קבוצה זו עבדה עם הטיפוס •

להכניס פנימה כל מופע מכל מחלקה. וזה האט את casting מצריכה Objectאך העבודה עם •

.containerהביצועים, כיום ניתן להגדיר את הטיפוס המוכנס ל , משום שדרוש containers ל primitive typesלא ניתן להכניס •

.Integerאובייקט, לכן יש את המחלקות העוטפות כדוגמת כמובן שהדבר צורך יותר זיכרון...•

Page 4: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Comparatorנניח שנרצה למיין רשימה, פעם בסדר עולה •

ופעם בסדר יורד, האם נצטרך לשם כך שני מימושים?

Strategyהתשובה היא לא, אם משתמשים ב •Pattern.

ע"פ תבנית זו, אלגוריתם המיון ישתמש •בהחלטה מבחוץ כיצד למיין את הרשימה.

Containersכדי להשפיע על שיטת המיון ב •, משתמשים בתבנית זו javaהשונים ב .comparatorבאמצעות

Page 5: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Comparatorכל מחלקה יכולה לממש את הממשקים הבאים:•

ע"פ המימוש באחד מממשקים אלו, ה •containers מחליטים כיצד למיין בפנים את

העצמים השמורים.

interface Comparator { int compare(Object o1, Object

o2); }

interface Comparable {int compareTo(Object o) ;

}

Page 6: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Comparatorדוגמא:•

public class RV1 implements Robot ,Comparable<Robot>{ … private String name; public String getName() { return name; }

public int compareTo(Robot arg0) { return name.compareTo(arg0.getName()); }}

Robot r1=new RV1();

Robot r2=new RV1();

Robot r3=new RV1();

r1.setName("aaabc");

r2.setName("aabc");

r3.setName("abc");

ArrayList<Robot> ar=new ArrayList<Robot>();

ar.add(r3);

ar.add(r2);

ar.add(r1);

Collections.sort(ar);

for(int i=0;i<ar.size();i++){

System.out.println(ar.get(i).getName());

}

:פלטaaabcaabcabc

מהירה ויציבה: merge sortמיון: אופטימיזציה של מיון מהיר:

- nlog(n) תמיד מובטח (בניגוד ל quick sort( עובד מהר יותר על רשימות כמעט ממוינות.-

מיון יציב :- לא ממיינת עצמים שווים.

(דוג' דואר שממוין לפי תאריך)

Page 7: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Containersשימושיים :Containers יש שני סוגים של javaב •

–Collectionsקבוצה של ערכים בודדים •List.רשימה: שומר על הערכים ברצף מסוים – •Set קבוצה: אותו הערך לא יכול להופיע יותר מפעם –

אחת.

–Mapקבוצה של הזוגות מפתח + ערך

לכל אלו מימושים שונים על בסיס הצורות •שלמדתם בקורס מבנה נתונים.

לכל אחד יתרונות וחסרונות אחרים, ולכן יש • לדרישות התוכנה.containerלהתאים את ה

Page 8: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Containersשימושיים להלן כמה דוגמאות:••List

–ArrayList ממומש על בסיס מערך: גישה אקראית מהירה, אך הוספה ומחיקה מהאמצע איטית.

–LinkedList ממומש על בסיס רשימה מקושרת דו כיוונית: גישה אקראית איטית, אך הוספה ומחיקה מהאמצע מהירה.

•Set –HashSet לשימוש כשזמן חיפוש האלמנט חשוב, יש לממש המתודה

HashCode().לאובייקט שברצוננו להכניס –TreeSet.ניתן בקלות להוציא רשימה ממוינת

•Map–HashMap ממומש באמצעות hash tables אובייקט המפתח חייב ,

()HashCodeלממש את –LinkedHashMap.אותו הדבר, אך שומר גם את סדר ההכנסה – –TreeMap.ממומש ע"י עץ אדום שחור, ניתן לקבל תוצאות ממוינות –

Page 9: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Containersשימושיים :Collectionsמתודות שימושיות ל •

– boolean add(Objetc o)– boolean add(Collection c)– void clear()– boolean contains(Object o)– boolean isEmpty() – Iterator iterator()– boolean remove(Object o) – boolean removeAll(Collection c)– int size()– Object[] toArray()

Page 10: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Containersשימושיים :Mapמתודות שימושיות ל •

– Object put(Object key, Object value) – void putAll(Map t)– Object get(Object key) – void clear() – boolean containsKey(Object key) – boolean containsValue(Object value) – boolean isEmpty()– Object remove(Object key) – int size() – Set entrySet()– Set keySet()– Collection values()

Page 11: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Iterator היא לספק גישה לעצמים ב Iteratorמטרת ה •

Container.מבלי לחשוף את אופן פעולתו

לדוג') לא ניתן לספק את כל Listבממשק (של •האופנים השונים בהם נרצה לטייל ב

container.

container עבור אותו ה iteratorsייתכנו כמה •כל אחד יטייל בדרך שונה על העצמים.

Page 12: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Iteratorדוגמאות:•

ArrayList<Robot> ar=new ArrayList<Robot> ();

ar.add(r3);

ar.add(r2);

ar.add(r1);

for(int i=0;i<ar.size();i++){

System.out.println(ar.get(i).getName());

}

Iterator<Robot> it=ar.iterator();

while (it.hasNext()){

System.out.println(it.next().getName());

}

Page 13: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Iteratorדוגמאות:•

–HashSet

–HashMap

HashSet hs<Robot>=new HashSet<Robot> ();

hs.add(r3);

hs.add(r2);

hs.add(r1);

Iterator<Robot> it=hs.iterator();

while (it.hasNext()){

System.out.println(it.next().getName());

}

String key;

HashMap<String,Robot> hm=new HashMap<String,Robot> ();

hm.put(r3.getName(), r3);

hm.put(r2.getName(), r2);

hm.put(r1.getName(), r1);

Iterator<String> it=hm.keySet().iterator();

while (it.hasNext()){

key=it.next();

System.out.println(hm.get(key).getName());

}

Page 14: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Factory Pattern סוגים של אובייקטים nבעיה: נניח שיש לנו •

ולכל אחד שם, אופן פעולת התוכנית צריך להיות כך שהמשתמש בכל פעם בוחר שם

והאובייקט הרצוי נוצר. השוואות כדי nלכאורה, במקרה הגרוע צריך •

לדעת באיזה שם המשתמש בחר, וע"פ השם O(n)הזה ליצור את האובייקט הרצוי.

דרך טובה יותר לפתור את הבעיה, היא •, יש הרבה Factory Patternלהשתמש ב

דרכים למימוש, נראה דוגמא לדרך אחת.

Page 15: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Factory Patternimport java.util.HashMap;

public class RobotFactory {

private interface RobotFac{

public Robot create();

}

private class RV1Fac implements RobotFac{

public Robot create(){ return new RV1();}

}

private class RV2Fac implements RobotFac{

public Robot create(){ return new RV2();}

}

private class AiboFac implements RobotFac{

public Robot create(){ return new Aibo();}

}

private HashMap<String,RobotFac> robotFactory;

public RobotFactory(){

robotFactory=new HashMap<String,RobotFac> ();

robotFactory.put("RV1", new RV1Fac());

robotFactory.put("RV2", new RV2Fac());

robotFactory.put("Aibo", new AiboFac());

}

public Robot createRobot(String type){

return ((RobotFac)robotFactory.get(type)).create();

}

}

.createניצור ממשק עם הפקודה 1.

Page 16: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Factory Patternimport java.util.HashMap;

public class RobotFactory {

private interface RobotFac{

public Robot create();

}

private class RV1Fac implements RobotFac{

public Robot create(){ return new RV1();}

}

private class RV2Fac implements RobotFac{

public Robot create(){ return new RV2();}

}

private class AiboFac implements RobotFac{

public Robot create(){ return new Aibo();}

}

private HashMap<String,RobotFac> robotFactory;

public RobotFactory(){

robotFactory=new HashMap<String,RobotFac> ();

robotFactory.put("RV1", new RV1Fac());

robotFactory.put("RV2", new RV2Fac());

robotFactory.put("Aibo", new AiboFac());

}

public Robot createRobot(String type){

return (robotFactory.get(type).create();

}

}

.createניצור ממשק עם הפקודה 1.

נממש את הממשק ע"י מחלקות עבור כל אחד מסוגי האובייקטים הרצויים.2.

Page 17: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

private HashMap<String,RobotFac> robotFactory;

public RobotFactory(){

robotFactory=new HashMap<String,RobotFac> ();

robotFactory.put("RV1", new RV1Fac());

robotFactory.put("RV2", new RV2Fac());

robotFactory.put("Aibo", new AiboFac());

}

public Robot createRobot(String type){

return (robotFactory.get(type).create();

}

}

Factory Patternimport java.util.HashMap;

public class RobotFactory {

private interface RobotFac{

public Robot create();

}

private class RV1Fac implements RobotFac{

public Robot create(){ return new RV1();}

}

private class RV2Fac implements RobotFac{

public Robot create(){ return new RV2();}

}

private class AiboFac implements RobotFac{

public Robot create(){ return new Aibo();}

}

.createניצור ממשק עם הפקודה 1.

נממש את הממשק ע"י מחלקות עבור כל אחד מסוגי האובייקטים הרצויים.2.

כשהמפתח הוא השם דרכו עבור המחלקות הנ"ל,HashMapניצור 3.המשתמש בוחר ליצור את האובייקט הרצוי.

Page 18: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

private HashMap<String,RobotFac> robotFactory;

public RobotFactory(){

robotFactory=new HashMap<String,RobotFac> ();

robotFactory.put("RV1", new RV1Fac());

robotFactory.put("RV2", new RV2Fac());

robotFactory.put("Aibo", new AiboFac());

}

public Robot createRobot(String type){

return (robotFactory.get(type).create();

}

}

Factory Patternimport java.util.HashMap;

public class RobotFactory {

private interface RobotFac{

public Robot create();

}

private class RV1Fac implements RobotFac{

public Robot create(){ return new RV1();}

}

private class RV2Fac implements RobotFac{

public Robot create(){ return new RV2();}

}

private class AiboFac implements RobotFac{

public Robot create(){ return new Aibo();}

}

.createניצור ממשק עם הפקודה 1.

נממש את הממשק ע"י מחלקות עבור כל אחד מסוגי האובייקטים הרצויים.2.

כשהמפתח הוא השם דרכו עבור המחלקות הנ"ל,HashMapניצור 3.המשתמש בוחר ליצור את האובייקט הרצוי.

Hashmap< ל <String, RobotFacנכניס את הזוגות 4.

Page 19: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

private HashMap<String,RobotFac> robotFactory;

public RobotFactory(){

robotFactory=new HashMap<String,RobotFac> ();

robotFactory.put("RV1", new RV1Fac());

robotFactory.put("RV2", new RV2Fac());

robotFactory.put("Aibo", new AiboFac());

}

public Robot createRobot(String type){

return (robotFactory.get(type).create();

}

}

Factory Patternimport java.util.HashMap;

public class RobotFactory {

private interface RobotFac{

public Robot create();

}

private class RV1Fac implements RobotFac{

public Robot create(){ return new RV1();}

}

private class RV2Fac implements RobotFac{

public Robot create(){ return new RV2();}

}

private class AiboFac implements RobotFac{

public Robot create(){ return new Aibo();}

}

.createניצור ממשק עם הפקודה 1.

נממש את הממשק ע"י מחלקות עבור כל אחד מסוגי האובייקטים הרצויים.2.

כשהמפתח הוא השם דרכו עבור המחלקות הנ"ל,HashMapניצור 3.המשתמש בוחר ליצור את האובייקט הרצוי.

Hashmap< ל <String, RobotFacנכניס את הזוגות 4.

פקודת יצירת האובייקט: בהינתן מחרוזת שהמשתמש בחר, ניגש בזמן5. אל האובייקט השמור תחת אותה המחרוזתHashMap ל O(1)של

ונקבל את האובייקט הרצוי.createכמפתח נקרא ל

.Factory ליצירת אובייקטים + נוחות לתחזק ולהוסיף בעתיד או אובייקטים ל O(1) מקום, וקיבלנו זמן של O(n) זמן ב O(n)החלפנו

Page 20: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Trove מקבלים אובייקט containersהעובדה ש •

מצריכה אותנו לבזבז זיכרון בעקבות השימוש במחלקות העוטפות, במקרה שאנו רוצים

.primitive typesלהשתמש רק ב חדשים Collections יצרה GNU Troveהקבוצה •

ובכך חוסכות זיכרון, primitive typesשמקבלים וכן משפרת משמעותית את הביצועים.

באתר הקורס פרטים על הורדה + הדרך •.eclipse לפרויקט באמצעות ה jarsלהוסיף

Page 21: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

Trove;*.import gnu.troveקוד לדוגמא:•

public class HelloWorldApp {

static TByteFloatHashMap hm=new TByteFloatHashMap();

public static void main(String[] args) {

float lastValueForThisKey;

byte key1=1,key2=2,key3=3;

hm.put(key1, (float) 0.2);

lastValueForThisKey=hm.put(key1, (float) 0.1);

System.out.println("last value for key1 was "+lastValueForThisKey);

hm.put(key2, (float) 0.2);

hm.put(key3, (float) 0.3);

TByteFloatIterator it= hm.iterator();

while (it.hasNext()){

it.advance();

System.out.println("key: "+it.key()+" , value: "+ it.value());

}

}

}

:פלטlast value for key1 was 0.2key: 2 , value: 0.2key: 1 , value: 0.1key: 3 , value: 0.3

Page 22: הקדמה Comparator Containers שימושיים Iterator Factory Pattern Trove הטמעה 89-210 תכנות מתקדם - תרגול 3 Containers ב Java אליהו חלסצ'י תכנות

הקדמהComparator

Containersשימושיים Iterator

Factory PatternTrove

הטמעה

תכנות מתקדם - תרגול 89-2103

הטמעה+C לעומת java ב containers חסרונות של ה 2מנה •

+ STL ()Collections.sortבאיזה אלגוריתם מיון משתמש •

ומדוע? boolean contains(Object o)בדקו האם המתודה •

מחזירה "אמת" לפי תוכן האובייקט או לפי מיקומו בזיכרון.

כגון containers ותכירו עוד Sunכנסו לאתר •PriorityQueue, Hashtable

trove באמצעות int כלשהו עבור collectionצרו •.iteratorותעברו עליו באמצעות