עבור לתוכן

עזרה ב-Java - השוואת מקטעים

Featured Replies

פורסם

יש לי Class Section:


public class Section
{
private Point _poCenterPoint;
private double _length;
}

ל-Class Point שגם בו אני משתמש יש מתודות של getX(), getY(), ו-setX, setY

Class Section זה מעין קטע שלו יש נק' אמצע (_poCenterPoint) ואורך (_length), הוא מקביל לציר ה-X ומקבל בבנאי שלו או 2 נק' או נק' אמצע ואורך.

אחת מהמתודות שאני אמור לרשום היא

public boolean equals(Section other)

ז"א אני מקבל מקטע אחר ומחזיר true אם הם זהים.

זו המתודה שלי:


public boolean equals(Section other)
{
if (this._poCenterPoint == other._poCenterPoint && this._length == other._length)
{
return true;
}
else
{
return false;
}
}

וה-main:


Point p1 = new Point(1.0, 4.0);
Point p2 = new Point(1.0, 4.0);
Section s2 = new Section(p1, 2);
Section s3 = new Section(p2, 2);
System.out.println(s2.equals(s3));

הבעיה שלי היא שאני לא מבין למה אני מקבל false שאני משווה בין 2 המקטעים שהם זהים לחלוטין.

פורסם

בשתי מילים: כשמשווים אובייקטים, צריך להשתמש בפונקציה equals ולא באופרטור ==. כדאי שכל אובייקט שאתה כותב ידרוס את הפונקציה equals עם מימוש מתאים.

ליתר פירוט, קרא על השוואה בג'אווה:

http://www.underwar.co.il/1-Programming/d161/22

עוד כמה הערות קטנות על הקוד שלך:

א. ברוב המקרים אין צורך להשתמש במילה this, אפשר לגשת ישירות לשדות של המחלקה שלך.

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

ג. התוצאה של ביטוי לוגי היא boolean. קוד מהצורה הבאה:

if (some condition) {
return true;
} else {
return false;
}

הוא מיותר, כי אפשר פשוט לעשות ככה:

return (some condition);

פורסם
  • מחבר

זה משהו ששונה למשל מ-.NET או שגם שם זה ככה ?

פורסם

בדוטנט זה אותו דבר, חוץ מעבור מחרוזות (כלומר, ב-#C אפשר לבצע השוואה בין שתי מחרוזות באמצעות ==, בעוד שבג'אווה צריך equals).

חוץ מזה, בדוטנט אפשר גם לדרוס את אופרטור == (בג'אווה אין דריסת אופרטורים), ככה שהן לא בדיוק אותו דבר.

פורסם
  • מחבר

לגבי שמות המשתנים זה משהו שמוגדר לי בשיעורי הבית ואני לא יכול לשנות (מורידים נק' על כל שטות)

תודה רבה על ההסבר !

פורסם
  • מחבר

אני לא מבין למה אני מצליח להשוות רק פעם אחת בתוך ה-if:

זה מתקבל:

if(this._poCenterPoint.equals(other._poCenterPoint))

זה לא:

if(this._poCenterPoint.equals(other._poCenterPoint) && this._length.equals(other._length))

פורסם

בשתי מילים: כשמשווים אובייקטים, צריך להשתמש בפונקציה equals ולא באופרטור ==.

פורסם
  • מחבר

אבל אני משתמש ב-equals

פורסם
  • מחבר

הבנתי תודה רבה.

פורסם

אני מתאר לעצמי שזה מאוחר מידי אולם יש לי שתי הערות

1) אתה צריך לממש ()equals גם למחלקה Point על מנת להשוות נכון בין שני אובייקטים מאותה מחלקה

2) למרות שהמתודה שלך אכן תופעל במקרה שלך, היא אינה דורסת את המתודה equals של המחלקה Object

יש לכך השלכות אם תחליט להוסיף מחלקת אב למחלקה שלך, או אם תחליט להשתמש באיזה collection

ארכיון

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

דיונים חדשים