HashMap גנרי בג'אווה. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

HashMap גנרי בג'אווה.


pain_killer12

Recommended Posts

שלום חברים, אני צריך לעשות שימוש בHashMap, שהמפתח של כל איבר יהיה מסוג String

והתוכן יהיה אובייקט מסוג מחלקה שאני יוצר.

העניין הוא כשאני מגדיר:

	private HashMap commandsMap; 

//CTOR
public Commands(Simulation s)
{
sim = s;
commandsMap = new HashMap<String,Robot>();

Commands זה שם המחלקה שההאשמאפ נמצא בתוכה.

הוא רושם לי את ההערה\אזהרה\שגיאה הבאה בצד:

HashMap is a raw type. References to generic type HashMap<K,V> should be parameterized

מה ההודעה אומרת?

תודה מראש לעוזרים.

קישור לתוכן
שתף באתרים אחרים

הכוונה היא להגדיר את commandsMap בתור Map, אבל לעשות לו new HashMap.

ההסבר:

Map זה ה-Interface, ו-HashMap זה המחלקה שמממשת אותו. בעקרון, איפה שאפשר, מומלץ להשתמש בinterface על פני המחלקה, כדי לשמור על הקוד שלך גמיש. אם בעתיד, לדוגמה, תחליט שאתה רוצה למעשה להשתמש בסוג אחר של Map (לדוגמה, LinkedHashMap) כל מה שתצטרך לעשות הוא להחליף את HashMap ל-LinkedHashMap בשורה שבה אתה עושה new.

קישור לתוכן
שתף באתרים אחרים

אם אני מממש ממשק, כמו שאמרת למשל.

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

השאלה היא אם אני יכול לגשת למשתנים\מתודות של הקלאס ה"בן" או לא?

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

קישור לתוכן
שתף באתרים אחרים

לא תוכל בלי לבצע casting.

נניח שיש ממשק בשם A, ושתי מחלקות בשם B ו-C שמממשות אותו.

נניח ש-B מגדיר מתודה כלשהי foo שלא מופיעה ב-A, ואתה מגדיר משתנה x שהטיפוס שלו הוא A, ומאתחל אותו באמצעות new B.

אז לא תוכל לעשות x.foo, כי לא מובטח לך שהטיפוס הדינמי (dynamic type) של x הוא אכן B - יכול להיות שאיפשהו בקוד מישהו עשה x = new C.

מה שכן, תוכל לעשות המרה - תגדיר B y = (B)x, ואז, אם הטיפוס הדינמי של x הוא אכן B, אז תוכל לעשות y.foo. שים לב שאם הטיפוס הדינמי הוא לא x אז תהיה לך שגיאה (או שתהיה לך שגיאת המרה, או שיוחזר null, אני לא באמת זוכר).

קישור לתוכן
שתף באתרים אחרים

הבנתי, תודה על העזרה.

עכשיו רציתי לשאול משהו בנוגע להעברה ש ל אובייקטים לפונ'\מתודות.

בC++ לימדו אותנו שעדיף במקרים להעביר ברפרנס כי אם יש אובייקט גדול אז הוא לא מועתק, אלא ניגשים אליו ברפרנס.

השאלה שלי היא האם בג'אווה זה עובד אותו דבר? מומלץ לשלוח אובייקטים ע"י רפרנס? יש דבר כזה בכלל? איך עושים?

קישור לתוכן
שתף באתרים אחרים

בג'אווה הכל עובר by reference (פרט לטיפוסים פרימיטיביים כמו int/boolean). אם אתה רוצה ספציפית להעתיק אובייקט, אז צריך לעשות clone (בהנחה שהאובייקט מימש את המתודה הזו) או copy constructor אם יש כזה.

קישור לתוכן
שתף באתרים אחרים

תודה על העזרה שניצל.

אודה לך אם תוכל לענות לי על עוד שאלה.

אחרי ששמרתי איברים בHashMap, רוצים שאני אצור PriorityQueue , אעביר אליו את הערכים (עם מימוש comprator)

ואז אדפיס אותם כאילו לפי סדר מסוים. הבעיה היא, שאין לי מושג איך לגשת לאיברים שבMap, הדרך היחידה שלי להשיג איבר

היא לפי הערך\המפתח שלו, אבל מה אם אני לא יודע אותם? במקרה שלי המפתח הוא מחרוזת והערך הוא אובייקט מסוג מסויים.

איך אפשר "להעתיק" את האיברים לתור?

קישור לתוכן
שתף באתרים אחרים

הוא רוצה שאני אספק לו איטרטור מה שאני לא יכול לעשות בMAP.

אם יש לי:

private HashMap<String,Robot> robots;//robots map
private int size; //size of the map
private PriorityQueue<Robot> pQ;

Robot הוא ממשק.

אז איך אני צריך לרשום את הלולאה שתעתיק ערכים מה-MAP לPQ?

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...