سؤال

قمت بإنشاء قائمة مرتبطة، مع إدراج وظائف "بحث وإزالة". أنا أيضا أنشأت معكاة كمير. الآن، لنفترض أنني أفعل هذا:

myList<Integer> test = new myList();
test.insert(30);
test.insert(20);
test.insert(10);
myList.iterator it = test.search(20);
if(it.hasNext())
    System.out.println(it.next());

وفويلا، تعمل (يطبع قيمة العنصر في العقدة، في هذه الحالة 20). الآن، إذا قمت بذلك:

myList<Double> test = new myList();
test.insert(30.1);
test.insert(20.1);
test.insert(10.1);
myList.iterator it = test.search(20.1);
if(it.hasNext())
    System.out.println(it.next());

لا، لأن جهاز المؤتمر يشير إلى null. هنا هو تطبيق وظيفة البحث:

public iterator search(T data)
{
    no<T> temp = first;
    while( (temp != null) && (temp.data != data) )
        temp = temp.next;
    return (new iterator(temp));
}

إليك كيف أعرف أن هناك شيء مريب مع المقارنات: إذا قمت بتغيير جزء من التعليمات البرمجية أعلاه مثل هذا:

while( (temp != null) && (temp.data != data) )
     System.out.println(temp.data + " " + data);
     temp = temp.next;

أستطيع أن أرى أنه طباعة الأرقام في القائمة. يطبع، عند نقطة واحدة، "20.1 20.1" (على سبيل المثال). فكيف يمكنني إصلاح هذا؟ يبدو أن الوظيفة صحيحة، ولكن يبدو أن جافا لا تقارن الأرقام بشكل صحيح.

تحرير: WTH، أعطاني BigdeCimal نفس النوع من المشكلة أيضا.

تحرير 2: تساوي () عملت، لم يدرك شيئا آخر كان خياليا. آسف.

هل كانت مفيدة؟

المحلول

أنت لا تريد! = المشغل لهذا. مراجع comapres. تريد .equals() طريقة:

public iterator search(T data)
{
    no<T> temp = first;
    while (!data.equals(temp.data)) {
        temp = temp.next;
    }
    return (new iterator(temp));
}

أيضا، احترس الملاكمة التلقائية. وبعد قد تجد ذلك test.search(20.1) صناديق 20.1 إلى Float ليس Double, ، والتي من شأنها أن كسر المقارنة الخاصة بك. قارن النتائج مع test.search(20.1d). وبعد إذا أذكر بشكل صحيح، فإن التعبير:

new Float(20.1).equals(new Double(20.1))

هو زائف.

نصائح أخرى

لاحظ أن استخدام .equals() لمقارنة الزوجي قد يؤدي إلى أخطاء. Double.equals() يستخدم هذا كاختبار المساواة:

 d1.doubleValue() == d2.doubleValue()

الزوجي و يطفو نكون تقريب من الأرقام المخزنة في مساحة ثابتة في الذاكرة.

من أجل قارن بشكل صحيح أرقام النقطة العائمة, ، عليك أن تدرك أنه بسبب طبيعة العوامات، سيكون هناك بعض الأخطاء.

يرى: http://www.google.com/search؟q=floativity+ المساواة

طريقة سريعة وسهلة لمقارنة الزوجي هي استخدام Math.abs(a-b)<ACCEPTABLE_ERRORحيث قبول_Error يمكن أن يكون .000000000001 اعتمادا على ما تفعله بالضبط.(لاحظ أن هذا لا يعالج حالات الحافة مثل NAN و Infinity)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top