עבור לתוכן

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

Featured Replies

פורסם

שלום חברים, אני צריך לעשות שימוש ב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 הטיפוס שלו צריך להיות <HashMap<String,Robot (או אפילו יותר טוב, <Map<String,Robot).

פורסם
  • מחבר

מה ההבדל בין Map לHashMap?

אני צריך שתהיה לי היכולת לשלוף איבר בO(1).

האם גם Map תומך בפונ' put?

פורסם

הכוונה היא להגדיר את 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?

ארכיון

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

דיונים חדשים