2013-04-09 126 views
0

我有一個計算包含的統計數據類型float的ArrayList的第95百分位的方法:我怎樣才能讓這個Java方法完全通用

public String calculatePercentile(ArrayList<Float> arrayOfStats) { 
    this.statistics = (ArrayList<Float>) arrayOfStats.clone(); 
    int N = statistics.size(); 
    int integerPart =0; 
    int fractionalPart =0; 
    int fraction =0; 
    float rank =0; 
    float floatPoint =0; 
    float interpolate=0; 
    float interpolateFirstPart =0; 
    float interpolateSecondPart =0; 

     if (N == 0) { 
     return Float.toString(0); 
     } else { 
     Collections.sort(statistics); 
     rank = (float) ((P/100.0) * (N - 1)); 
      if (rank == Math.round(rank)) { 
       return Float.toString(statistics.get((int) rank));    
      } else { 
       String split = Float.toString(rank); 
       Pattern pattern = Pattern.compile(floatRegExPattern); 
       Matcher matcher = pattern.matcher(split); 
       while(matcher.find()) { 
       integerPart = Integer.parseInt(matcher.group(1)); 
       fractionalPart = Integer.parseInt(matcher.group(3)); 
       } 

       if (fractionalPart < 10) { 
        floatPoint = (float) (fractionalPart/10); 
       } else { 
        floatPoint = (float) fractionalPart/100; 
       }   
     fraction = integerPart + 1; 
     interpolateFirstPart = statistics.get(fraction); 
     interpolateSecondPart = statistics.get(integerPart); 
     interpolate = interpolateFirstPart - interpolateSecondPart; 
     return roundToTwoDecimalPlaces((floatPoint * interpolate) + interpolateFirstPart); 
     } 
     } 
} 

我的問題是我怎麼能做出這種方法一般使它不能只是接受並計算Float類型的ArrayList,但它也可以做整型等我曾嘗試使用模板,如

ArrayList<? as Number> 

,但是當我到達Collections.sort,它抱怨和我不能」弄清楚什麼是錯的。返回值需要是一個字符串。

+1

將Number用作泛型是相當困難的,因爲由於顯而易見的原因它無法進行數學運算。您可以使用列表,然後調用doubleValue,然後以雙精度執行所有算術。 – 2013-04-09 17:44:32

+0

你最好不要那麼做,你的ArrayList已經使用tripple所需的內存。所以ArrayList 就足夠了。如果您想要大量元素,請考慮使用Appache Commons-Math的GrowingIntArray(具有統計功能);不推薦使用正則表達式計算95%的百分位數。 – AlexWien 2013-04-09 17:53:31

回答

3

您可以使用

public <T extends Number> String calculatePercentile(ArrayList<T> arrayOfStats) { 

,然後用Number.floatValue檢索每個統計作爲一個float。您可能必須使用它來編寫自己的比較器來進行排序。比較器可能是這樣的:

Comparator<Number> c = new Comparator<Number>() { 
    public int compare(Number a, Number b) { 
     return Float.compare(a.floatValue(), b.floatValue()); 
    } 
} 

順便說一句,分配給statistics一個更好的方式是:

this.statistics = new ArrayList<Number>(arrayOfStats); 

你不需要克隆和演員。