ما هي أفضل طريقة للحصول على min و max قيمة من قائمة المتماثلة الرئيسية التي تحتوي على قيم خالية?

StackOverflow https://stackoverflow.com/questions/369383

  •  21-08-2019
  •  | 
  •  

سؤال

أنا أفكر في شيء من هذا القبيل:

public static <T extends Comparable<T>> T minOf(T...ts){        
    SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
    return set.first();
}

public static <T extends Comparable<T>> T maxOf(T...ts){
    SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
    return set.last();
}

ولكن ليست فارغة آمنة ، وهو أمر أريد أيضا.

هل تعرف أفضل طريقة لحل هذه المشكلة ؟

تحرير:

بعد التعليقات كما أنني حاولت مين():

public static <T extends Comparable<T>> T minOf(T...ts){        
    return Collections.min(Arrays.asList(ts), new Comparator<T>(){

        public int compare(T o1, T o2) {
            if(o1!=null && o2!=null){
                return o1.compareTo(o2);
            }else if(o1!=null){
                return 1;
            }else{
                return -1;  
            }
        }});
}

ما رأيك في هذا ؟

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

المحلول

ما هو الخطأ في <لأ href = "http://java.sun.com/javase/6/docs/api/java/util/Collections.html#max(java.util.Collection)" يختلط = "noreferrer "> Collections.max ؟

وماذا يهمك سلامة فارغة؟ هل أنت متأكد أنك تريد السماح بلا قيم ليكون في مجموعتك؟

نصائح أخرى

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

وتحرير: وهنا بعض التعليمات البرمجية لتوضيح ما أتحدث عنه. للأسف هناك حالة حافة تحتاج إلى النظر - ما إذا كانت كافة الوسيطات التي تم تمريرها في لاغية؟ ماذا يعود طريقتك؟

public static <T extends Comparable<T>> T minOf(T...ts){
    T min = null;
    for (T t : ts) {
        if (t != null && (min == null || t.compareTo(min) < 0)) {
            min = t;
        }
    }
    return min;
}

public static <T extends Comparable<T>> T maxOf(T...ts){
    T max = null;
    for (T t : ts) {
        if (t != null && (max == null || t.compareTo(max) > 0)) {
            max = t;
        }
    }
    return max;
}

لك لا ينبغي أن تنفيذ Comparable لقبول null, كما يكسر واجهة العقد.

من https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html :

ملاحظة: هذا باطل لا مثيل أي فئة e.compareTo(null) يجب رمي NullPointerException على الرغم هـ.يساوي(null) بإرجاع خطأ.

يجب عليك بدلا من ذلك إنشاء واجهة جديدة ، مثل ComparableNull بدلا من ذلك.

انظر أيضا:

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