» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
תוכנית רשימות לדודמא
דף ראשי  מתקדמים  וקטורים, Hashtables ורשימות  תוכנית רשימות לדודמא גרסה להדפסה

תוכנית רשימות לדוגמא

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

התוכנית מגדירה מחלקה בשם MyDataStruct אשר יוצרת מבנה נתונים המורכב ממערך של מחרוזות. המחלקה מספקת פונקציה אשר מחזירה אובייקט ממחלקה המיישם ממשק רשימות (אובייקט רשימות).

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

בתוכנית זו, המחלקה השולטת

·    מאתחלת אובייקט מסוג MyDataStruct,

·   קוראת לשיטת ה- ()getEnum להביא אובייקט רשימה

·   ומשתמשת באובייקט על מנת לעבור בין מבני הנתונים תוך שליפה והצגה של כל אחד    
   מהאלמנטים במבנה.

התוכנית נבדקה תוך שימוש ב- JDK 1.1.3תחת Win95.
הפלט מהרצת התוכנית מוצג בתחילת הרישום המלא של התוכנית בחלק מאוחר יותר.

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

 

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

·   אחד על מנת לספור אובייקטים כשהם נשלפים על ידי פונקצית ()nextElement .

·   אחד לעקוב אחר הגודל הכולל (מספר אלמנטים כולל) של האובייקט לו מבצעים רישום.

·   אחד המהווה פוינטר לאובייקט הרשימות.

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


 

class MyEnumerator implements Enumeration{
  int count;//store iteration counter here
  int length;//store array length here
  Object[] dataArray;//store reference to data array here

 

 

 

 

 

 

 

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

הבנאי מקבל מידע עבור שלושת משתני האובייקט הקריטיים הללו ומאחסן את המידע במשתנים.

 

 

  MyEnumerator(int count,int length,Object[] dataArray){
    this.count = count;
    this.length = length;
   this.dataArray = dataArray;
  }//end constructor

 

 

 

 

 

 

 

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

 

  public boolean hasMoreElements(){
    return (count < length);
  }//end hasMoreElements

 

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

 

  public Object nextElement(){
    return dataArray[count++];
  }//end nextElement

 

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

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

 

class MyDataStruct{
  String[] data;//array of refs to String objects
    MyDataStruct(){//constructor
    data = new String[4];
    data[0] = "zero";
    data[1] = "one";
    data[2] = "two";
    data[3] = "three";
  }//end constructor 

 

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

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

-  בפרמטר הראשון משתמשים על מנת לאתחל מונה באובייקט הרשימה הראשון (יתכן וזה מופיע 
   כמידע קשיח בתוך הבנאי ואינו זקוק לפרמטר).

 

- הפרמטר השני הוא אורך המערך.

 

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

 

  Enumeration getEnum(){
    return new MyEnumerator(0,data.length,data);
  }//end getEnum()

 

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

 

הקוד שנשאר זהו קוד במחלקת הבקרה אשר

·  מאתחל אובייקט מבנה נתונים,

·  משיג אובייקט רשימה עבור אובייקט זה

·  וקורא לשתי פונקציות לאובייקט רשימה זה על מנת להחזיר ולהציג את המחרוזת המאוחסנת
   בתוך אובייקט מבנה הנתונים.

 

class Enum01{//controlling class
  public static void main(String[] args){
    MyDataStruct myDataStruct = new MyDataStruct();
    Enumeration myEnumeration = myDataStruct.getEnum();
   while(myEnumeration.hasMoreElements()){
      System.out.println(myEnumeration.nextElement());
   }//end while loop
  }//end main()}//end controlling class

 

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

 02-12-03 / 19:07  עודכן ,  01-12-03 / 21:29  נוצר ע"י רונית רייכמן  בתאריך 
 וקטורים, Hashtables ורשימות - הקודםהבא - רישום תוכנית עבור תוכנית רישום 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 2