الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في المقارنة في برنامج Phonebook باستخدام BST

مغلق
بدأه Eng.Fouad في 6 مايو 2011 · 7 رد · 475 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

حالياً أعمل على مشروع Phonebook باستخدام الـ Binary Search Tree .

بالمرفقات تجدون الملفات. جميع الكلاسات كاملة ما عدا الكلاس الرئيسي Phonebook.java .

عندما أقوم بتشغيل البرنامج واختيار إضافة سجل جديد (new record) إلى دفتر العناوين لا تحدث اي مشكلة في المرة الأولى لكن في المرة الثانية تحدث المشكلة. المشكلة هنا هي أنه في أول مرة تكون الشجرة فارغة ولا تحتوي على أي نود (Node) لذا إضافتها ليس بها أية مشكلة، ولكن عند غضافة السجل الثاني يقوم البرنامج بعمل مقارنة بين السجل الجديد والسجل القديم لتحديد ما هو الـ (root) وما هو الـ (child) وهل هو على اليمين أم على اليسار.

الـ (Binary Search Tree) في مشروعي عام، لذلك استخدمت الـ generics، لذا يمكنني أمثل الـ (Node) بأي كلاس .. في مشروعي مثلته بالكلاس (Pair) والذي يحتوي على عنصرين (String name, String number).

المشكلة التي واجههتها هي عملية مقانة بين 2 (objects) بحيث أن الشجرة عامة وبالتالي ستتم المقارنة بين (two E types) .. بينما في مشروعي المقارنة ستتم بين (two Pairs) استناداً على الاسم (name) فقط.

أتمنى بأن تكون فكرة البرنامج قد وضحت، وأتمنى أيضاً بأن أجد من يساعدني في حل هذا الإشكال.

وشكراً.

"تم حذف المرفقات"

تم تعديل هذه المشاركة بواسطة Eng.Fouad في 6 مايو 2011 في 18:28

597657.png
#2
اقتباس
المشكلة التي واجههتها هي عملية مقانة بين 2 (objects) بحيث أن الشجرة عامة وبالتالي ستتم المقارنة بين (two E types) .. بينما في مشروعي المقارنة ستتم بين (two Pairs) استناداً على الاسم (name) فقط.

يا أخى ... ال E type المستخدمه في ال PhoneBook.java هى من نوع Pair و هذه الفئه تقوم بعمل implement لل Comparable.. و تقدم implementation للداله compareTo

// ***** COMPARSION METHOD *****

	public int compareTo(Pair pair)
	{
    	return name.compareTo(pair.getName());
	}

و دوال الفئه BSTree تستخدم ال compareTo مثل:

 public void insert(E entry)
	{
    	if (root == null) createFirstNode(entry);
    	else
    	{
        	search(entry);
        	if (c.compare(entry, current.getElement()) < 0) addLeft(entry);
        	//if (c.compare(entry, current.getElement()) > 0) addRight(entry);
        	else addRight(entry);
    	}
	}

إذن ما هى المشكله إذن؟؟

#3

لا أعلم ما هي المشكلة، لذلك طرحت عليكم السؤال

597657.png
#4

طب إذن إن لم تكن تعرف المشكله فما هي أعراضها؟؟

#5

سأشرح المشكلة مرة أخرى:

البرنامج يستند على نظام الشجرة والنود (Tree & its nodes). في بداية البرنامج الشجرة فارغة فبالتالي إضافة أول نود (الذي يمثل سجل في دفتر العناوين (اسم، رقم) Pair) لا يؤدي إلى أية مشكلة، ولكن عند إضافة النود الثاني (السجل الثاني) سيقوم البرنامج بعمل مقارنة بين النود الأول والنود الجديد حتى يتسنى له ترتيب الشجرة على أساس (Binary Search Tree، والذي من أهم خصائصه أن كل نود على يساره قيم أقل من قيمته وعلى يمينه قيم أعلى من قيمته). ولكن عندما أشغّل البرنامج وأقوم بإضافة النود الأول ثم النود الثاني يخبرني البرنامج بوجود مشكلة عند المقارنة بين النودين (السجلين). مع ملاحظة بأنني أريد أن تكون المقارنة بين 2 (Pair) على أساس اسميهما (الترتيب الأبجدي).

هل وضحت الفكرة ؟

597657.png
#6

ربما اكتشفت ما هي المشكلة:

عدلت الميثود compareTo الموجودة في كلاس Pair بالكود التالي:

@Override
    public int compareTo(Pair pair)
    {
        System.out.println(name);
        System.out.println(pair.getName());
        return name.compareTo(pair.getName());
    }

فطبع لي null للاسمين

يا ترى، كيف أحل هذه المشكلة؟

تم تعديل هذه المشاركة بواسطة Eng.Fouad في 6 مايو 2011 في 18:16

597657.png
#7

اكتشفت ما هي المشكلة: لقد عرّفت الكلاس Pair بشكل خاطئ

public Pair(String FirstElement, String SecondElement)
    {
        this.name = name;
        this.number = number;
    }

شكراً لكم

597657.png
#8

ههههههههههه ..

لقد لاحظتها و قمت بتصحليها عندي .. لذا ربما لم ألحظ وجود مشاكل ...

حظ موفق ..

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…