java - 我怎样才能使这个Java方法完全通用

标签 java templates

我有一个方法可以计算包含统计数据的 Float 类型的 ArrayList 的第 95 个百分位数:

    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 时,它会提示,我不知道出了什么问题。返回值必须是字符串。

最佳答案

您可以使用

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

顺便说一句,分配给统计的更好方法是:

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

您不需要克隆和施放。

关于java - 我怎样才能使这个Java方法完全通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15908784/

相关文章:

编译错误后的 Java 类 PdfFormFiller

java - 如何迭代不同对象的arraylist

c++ - 关于自定义分配器的问题

c++ - 从函数类型中剥离所有限定符

c++ - 模板仿函数与函数

c++ - 如何在编译时验证模板类是从给定类派生的?

java - 在 eclipse 中自动为每个 "newly generated java file"插入一个标准注释头

Java位移位结果为负数

java - JimFS:如何从路径获取文件

c++ - 如何让编译器推断出模板化 get 函数的正确返回类型?