2013-04-09 46 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); 

你不需要克隆和演员。