2015-04-29 12 views
10

Ortanca 3 değeri elde etmek için bir yönteme ihtiyacım vardı, çünkü gerçekten pratik yapmadığım için genel bir yöntem yazmak için iyi bir fırsat olduğunu düşündüm. Bunu yazdım ve bir uyarı alsam da oldukça düz görünüyor, ama testlerime göre iyi çalışıyor gibi görünüyor.3 Değerin medyanını bulmak için Jenerik Metot

Doğası gereği sıralanmış bir kümeyi veya Collections.sort() kullanabileceğimin farkındayım, ancak bu yaklaşım anlamaya yöneliktir.

bir kaç şey kesin olarak belirlemek istiyorum:

bu ben bu yüzden Arrays.asList(a, b, c) ile medianHelper ilan etmeye çalışması halinde çalışmaz fark
  1. ? Bunu aramaya çalışmak ilgisiz sonuçlar veriyor ve ne olduğundan emin olmadığımdan başka bir şekilde zor. Ben bir UnsupportedOperationException aldım, ancak bu aşağıda sahip olduğum şekilde mevcut değil.
  2. Neden bir uyarı alıyorum? Yanlış/eksik nedir?

yöntem aşağıdaki gibidir:

private static <T extends Comparable> T median(T a, T b, T c) { 
    List<T> medianHelper = new ArrayList<>(); 
    T max; 
    T min; 

    medianHelper.add(a); 
    medianHelper.add(b); 
    medianHelper.add(c); 

    if (a.compareTo(b) >= 0) { 
     max = a; 
     min = b; 
    } else { 
     max = b; 
     min = a; 
    } 

    if (max.compareTo(c) == -1) { 
     max = c; 
    } 

    if (min.compareTo(c) >= 0) { 
     min = c; 
    } 

    medianHelper.remove(max); 
    medianHelper.remove(min); 

    return medianHelper.get(0); 
} 
+0

Hangi uyarıları alıyorsunuz? – benzonico

cevap

12

Doğru Comparable olarak, tip-parametresini T tanıtıldı edilmeyen çok geneldir.

Oldukça olmalıdır:

private static <T extends Comparable<? super T>> T median(T a, T b, T c) 

Dahası, sadece sıralamamedianHelper liste, elemanları beri Comparable olacak olabilir.

private static <T extends Comparable<? super T>> T median(T a, T b, T c) { 
    List<T> medianHelper = Arrays.asList(a, b, c); 

    Collections.sort(medianHelper); 

    return medianHelper.get(1); 
} 

Not Arrays.asList() olduğunu getiri eklemek/oluşturulduktan sonra öğeleri kaldırmak için izin yok demektir degistiremeyeceginiz listesi: Yani yöntem önemli ölçüde için kısaltılabilir. Karşılaştırmaları kendiniz yapmak isterseniz, Arrays.asList() yerine new ArrayList<> kullanın ve öğeleri el ile ona ekleyin.

+2

Bu, '' T uzatmaları karşılaştırılabilir ' – fge

+0

Gerçekten de olmalıdır. Düzenlemeyi uygulamak üzereydim. Teşekkürler. –

+0

Teşekkür ederim, kocko. Tamamen göz ardı ettim ki, “karşılaştırılabilir” geneldir, ve teşekkür ederim, önemli bir ayrıcalık için, aynı zamanda bir üst sınırı da vardır. Karşılaştırmaları kendim yapmak istiyorsam hala Arrays.asList hataları konusuna çok şaşırdım. Düşüncesi olan var mı? – Legato