2015-04-29 44 views
10

我需要一個方法來獲得3個值的中位數,我認爲這是一個很好的機會寫一個通用的方法,因爲我真的沒有這種做法。我寫了這篇文章,看起來非常直截了當,雖然我得到了一個警告,但根據我的測試,它似乎工作正常。通用方法來找到3個值的中位數

我知道我可以使用固有排序集或Collections.sort(),但這種方法是爲了理解。

我想找出幾件事情:

  1. 我注意到這不,如果我想聲明medianHelperArrays.asList(a, b, c)這是爲什麼工作?試圖搜索這個結果給了我無關的結果,因爲我不確定發生了什麼,所以它是難以捉摸的。我得到一個UnsupportedOperationException,但這不是我下面的方式。
  2. 爲什麼我會收到警告?什麼是錯的/失蹤?

的方法如下:

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

你會得到什麼警告? – benzonico

回答

12

您沒有正確導入型參數T,爲Comparable是通用的,太。

它應該是:

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

此外,你可以排序medianHelper列表中,因爲它的元素Comparable。所以,你的方法可以顯著縮短爲:

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); 
} 

注意Arrays.asList()返回一個不可修改的列表,這意味着你不允許添加/它的創建後刪除元素。如果您想親自進行比較,則可以使用new ArrayList<>而不是Arrays.asList(),然後手動向其添加元素。

+2

這應該是'T延伸可比' – fge

+0

確實。我正要應用編輯。謝謝。 –

+0

謝謝你,kocko。我完全忽略了「Comparable」是泛型的,並且非常感謝,對於重要的區別它也有一個上限。如果我想自己進行比較,我仍然對Arrays.asList錯誤的主題感到困惑。有什麼想法嗎? – Legato

相關問題