سؤال

ولدي الطبقة، التي أشرت مبسط لهذه:

final class Thing {
    private final int value;
    public Thing(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    @Override public String toString() {
        return Integer.toString(value);
    }
}

وأريد أن فرز مجموعة من هذا الشيء. لذلك أنا خلقت copmarator بسيط:

private static final Comparator<Thing> reverse = new Comparator<Thing>() {
    public int compare(Thing a, Thing b) {
        return a.getValue() - b.getValue();
    }
};

وبعد ذلك استخدام النموذج اثنين حجة Arrays.sort.

وهذا يعمل بشكل جيد لحالات الاختبار الخاص بي، ولكن أحيانا يذهب كل خطأ مع مجموعة حيث يصل إلى أمر غريب ولكن تكرار. كيف يمكن أن يكون هذا؟

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

المحلول

وتجاوز عدد صحيح ... أو بتعبير أدق، تجاوز الحد الأدنى.

وبدلا من ذلك، القيام مقارنة صريحة:

private static final Comparator<Thing> reverse = new Comparator<Thing>() {
    public int compare(Thing a, Thing b) {
      int av = a.getValue(), bv = b.getValue();
      return (av == bv) ? 0 : ((av < bv) ? -1 : +1);
    }
};

وعن طريق الطرح على ما يرام إذا كنت متأكدا من أن الفرق لن "التفاف حول". على سبيل المثال، عندما يتم تقييد القيم في مسألة أن يكون غير سالب.

نصائح أخرى

ولا يمكنك استخدام ناقص لإنشاء المقارنة. سوف تفيض عندما يتجاوز الفرق المطلق Integer.MAX_VALUE.

وبدلا من ذلك، استخدم هذه الخوارزمية:

int compareInts( int x, int y ) {
  if ( x < y ) return -1;
  if ( x > y ) return 1;
  return 0;
}

وأحب أن يكون هذه الدالة في مكتبة لمثل هذه الأغراض.

والمحاولة

System.out.println(Integer.MAX_Value - Integer.MIN_VALUE);

وهذا يحتاج لإرجاع رقم موجب كما MAX_VALUE> MIN_VALUE ولكن بدلا من طباعة -1

عند مقارنة البدائيون جافا، فإنه من المستحسن لتحويلها إلى نظرائهم كائن وتعتمد على أساليب compareTo() بهم.

في هذه الحالة يمكنك القيام به:

return Integer.valueOf(a.getValue()).compareTo(b.getValue())

وعندما تكون في شك، استخدام مكتبة اختباره بشكل جيد.

ما هو نوع من الأرقام هل رمي هناك؟ إذا الأرقام الخاصة بك كبيرة بما فيه الكفاية، هل يمكن أن التفاف من خلال القيم MIN / MAX عن الأعداد الصحيحة وينتهي بهم المطاف في حالة من الفوضى.

إذا قيمة هي سلبية للغاية وقيمة ب هي إيجابية للغاية والإجابة تكون خاطئة جدا.

وIIRC، الباحث تجاوز يلتف حول بصمت في JVM

و- MarkusQ

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