הקדמה comparator containers שימושיים iterator factory pattern trove הטמעה 89-210...
TRANSCRIPT
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
ContainersContainers ב ב JavaJava
אליהו חלסצ'י
89-21089-210תכנות מתקדם תכנות מתקדם 3תרגול מספר
2009-2010תש"ע
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
כלל חשוב לגבי השיעורים הבאים:
לא בזמן לא בזמן שאלות על שיעורי הבית – •התרגול.התרגול.
ניתן לשאול, כמובן, אחרי.•
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
הקדמה.templates אין javaב •המפתחים החליטו שניתן לתכנת בצורה גנרית גם ללא תמיכה •
.templatesב , שיכולה לספק את רוב collectionsבמקום, ישנה קבוצה של •
.containersהצרכים שלנו ב .++C של STLקבוצה זו לא נבנתה לשם יעילות כמו ה • וכך היה ניתן Objectבעבר קבוצה זו עבדה עם הטיפוס •
להכניס פנימה כל מופע מכל מחלקה. וזה האט את casting מצריכה Objectאך העבודה עם •
.containerהביצועים, כיום ניתן להגדיר את הטיפוס המוכנס ל , משום שדרוש containers ל primitive typesלא ניתן להכניס •
.Integerאובייקט, לכן יש את המחלקות העוטפות כדוגמת כמובן שהדבר צורך יותר זיכרון...•
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
Comparatorנניח שנרצה למיין רשימה, פעם בסדר עולה •
ופעם בסדר יורד, האם נצטרך לשם כך שני מימושים?
Strategyהתשובה היא לא, אם משתמשים ב •Pattern.
ע"פ תבנית זו, אלגוריתם המיון ישתמש •בהחלטה מבחוץ כיצד למיין את הרשימה.
Containersכדי להשפיע על שיטת המיון ב •, משתמשים בתבנית זו javaהשונים ב .comparatorבאמצעות
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
Comparatorכל מחלקה יכולה לממש את הממשקים הבאים:•
ע"פ המימוש באחד מממשקים אלו, ה •containers מחליטים כיצד למיין בפנים את
העצמים השמורים.
interface Comparator { int compare(Object o1, Object
o2); }
interface Comparable {int compareTo(Object o) ;
}
הקדמה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( עובד מהר יותר על רשימות כמעט ממוינות.-
מיון יציב :- לא ממיינת עצמים שווים.
(דוג' דואר שממוין לפי תאריך)
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
Containersשימושיים :Containers יש שני סוגים של javaב •
–Collectionsקבוצה של ערכים בודדים •List.רשימה: שומר על הערכים ברצף מסוים – •Set קבוצה: אותו הערך לא יכול להופיע יותר מפעם –
אחת.
–Mapקבוצה של הזוגות מפתח + ערך
לכל אלו מימושים שונים על בסיס הצורות •שלמדתם בקורס מבנה נתונים.
לכל אחד יתרונות וחסרונות אחרים, ולכן יש • לדרישות התוכנה.containerלהתאים את ה
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
Containersשימושיים להלן כמה דוגמאות:••List
–ArrayList ממומש על בסיס מערך: גישה אקראית מהירה, אך הוספה ומחיקה מהאמצע איטית.
–LinkedList ממומש על בסיס רשימה מקושרת דו כיוונית: גישה אקראית איטית, אך הוספה ומחיקה מהאמצע מהירה.
•Set –HashSet לשימוש כשזמן חיפוש האלמנט חשוב, יש לממש המתודה
HashCode().לאובייקט שברצוננו להכניס –TreeSet.ניתן בקלות להוציא רשימה ממוינת
•Map–HashMap ממומש באמצעות hash tables אובייקט המפתח חייב ,
()HashCodeלממש את –LinkedHashMap.אותו הדבר, אך שומר גם את סדר ההכנסה – –TreeMap.ממומש ע"י עץ אדום שחור, ניתן לקבל תוצאות ממוינות –
הקדמה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()
הקדמה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()
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
Iterator היא לספק גישה לעצמים ב Iteratorמטרת ה •
Container.מבלי לחשוף את אופן פעולתו
לדוג') לא ניתן לספק את כל Listבממשק (של •האופנים השונים בהם נרצה לטייל ב
container.
container עבור אותו ה iteratorsייתכנו כמה •כל אחד יטייל בדרך שונה על העצמים.
הקדמה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());
}
הקדמה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());
}
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
Factory Pattern סוגים של אובייקטים nבעיה: נניח שיש לנו •
ולכל אחד שם, אופן פעולת התוכנית צריך להיות כך שהמשתמש בכל פעם בוחר שם
והאובייקט הרצוי נוצר. השוואות כדי nלכאורה, במקרה הגרוע צריך •
לדעת באיזה שם המשתמש בחר, וע"פ השם O(n)הזה ליצור את האובייקט הרצוי.
דרך טובה יותר לפתור את הבעיה, היא •, יש הרבה Factory Patternלהשתמש ב
דרכים למימוש, נראה דוגמא לדרך אחת.
הקדמה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.
הקדמה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.
הקדמה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.המשתמש בוחר ליצור את האובייקט הרצוי.
הקדמה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.
הקדמה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)החלפנו
הקדמהComparator
Containersשימושיים Iterator
Factory PatternTrove
הטמעה
תכנות מתקדם - תרגול 89-2103
Trove מקבלים אובייקט containersהעובדה ש •
מצריכה אותנו לבזבז זיכרון בעקבות השימוש במחלקות העוטפות, במקרה שאנו רוצים
.primitive typesלהשתמש רק ב חדשים Collections יצרה GNU Troveהקבוצה •
ובכך חוסכות זיכרון, primitive typesשמקבלים וכן משפרת משמעותית את הביצועים.
באתר הקורס פרטים על הורדה + הדרך •.eclipse לפרויקט באמצעות ה jarsלהוסיף
הקדמה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
הקדמה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ותעברו עליו באמצעות