سؤال

لدي الكود التالي، الذي يقسم المتجه إلى ناقل سلسلة (لاستخدامه كمفتاح) وعدد صحيح في النهاية (لاستخدامه كقيمة).

payoffs.put(new Vector<String>(keyAndOutput.subList(0, keyAndOutput.size() - 1)), Integer.parseInt(keyAndOutput.lastElement()));

تم إنشاء TreeMap المعني باستخدام مقارنة بالطريقة التالية، والتي تفرض ترتيبًا معجميًا مستقلاً عن الحالة يأخذ أيضًا الطول في الاعتبار (المتجهات الأطول تكون دائمًا "أكبر" من المتجهات الأقصر).

public int compare(Vector<String> arg0, Vector<String> arg1) {
        int sgn = 0;
        if (arg0.size() > arg1.size()) {
            return 1;
        } else if (arg0.size() < arg1.size()) {
            return -1;
        }
        for (int i = 0; i < arg0.size(); i++) {
            if (arg0.elementAt(i).compareToIgnoreCase(arg1.elementAt(i)) == 1) {
                sgn = 1;
                break;
            } else if (arg0.elementAt(i).compareToIgnoreCase(arg1.elementAt(i)) == -1) {
                sgn = -1;
                break;
            } else {
                continue;
            }
        }
        return sgn;
    }

الآن، بالنسبة للمشكلة... على الرغم من وجود 8 إدخالات في الملف النصي الذي تتم القراءة منه، تحصل الخريطة على ما يصل إلى إدخالين فقط.بمجرد إدخال (مفتاح) واحد، فإنه يبقى، لكن القيمة تتغير مع كل تكرار لعملية المسح (في كل مرة تتم قراءتها في متجه جديد من سطر في الملف).إنه يرمي جميع المفاتيح الأخرى باستثناء الاثنين.

هل هذه مشكلة مع المقارنة الخاصة بي؟أم أن TreeMap يفعل شيئًا لا أفهمه باستخدام put()؟

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

المحلول

الرد غير مجاب السؤال مع لكن بضع نقاط بسيطة إلى جانب التعليمات البرمجية الخاصة بك:

  1. لا يجب عليك إجراء المقارنة مرتين؛قارن مرة واحدة وقم بتعيين النتيجة إلى sgn؛ثم كسر إذا !=0
  2. مواصلة الخاص بك آخر زائدة عن الحاجة.
  3. يجب ألا تقارن بـ -1 أو 1، بل بـ <0 أو >0؛تُرجع العديد من أساليب المقارنة بناءً على (x1-x2)، والتي يمكن أن تعطي أي رقم سالب أو موجب.

يحرر:دوه!وبطبيعة الحال، فإن إرجاع String.compareToIgnoreCase() هو أحد تلك المقارنات (3).كما تم نشر الإجابة الأخرى في نفس الوقت الذي أشارت فيه إجابتي، فمن المحتمل أن يكون هذا هو سبب خطأك.

تحرير 2:تم بالفعل الإجابة على البيان الافتتاحي المصحح ليعكس السؤال.

نصائح أخرى

وأنا لا أعرف إذا كان هذا هو سبب المشكلة، ولكن مقارنة وظائف في جاوة عادة العودة سلبية أو إيجابية أو 0، وليس بالضرورة 1 أو -1.

وأنا على استعداد للمراهنة على أن تقوم بطريقة أو بأخرى الحصول على قيمة غير صفرية من compareToIgnoreCase، ولكن لأنها ليست 1 أو -1 تقع من خلال، وينتهي عودته 0 على الرغم من أن صفائف متطابقة في طول وليس المحتوى. حاول التحقق ضد> 0 و<0

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

والواقع، وخدعة قد يكون في الواقع أنني أخطأت ما ثائق compareTo () وقال في الواقع ... والخبر في الوقت اختبارها.

وAaand، الذي كان عليه. شكر شخصا.

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