【问题标题】:How to get the average of a generic array list in java?如何在java中获得通用数组列表的平均值?
【发布时间】:2016-03-06 21:18:40
【问题描述】:

我无法获取 T 类型的通用数组列表的平均值。

【问题讨论】:

  • 如何获得T类型的两个元素的平均值?
  • public T getAverage(ArrayList sensor) { Double sum = 0.0;整数计数 = 0;双重平均 = 0.0; for (int i = 0; i
  • 如果sensorArrayList<String> 怎么办?那是行不通的。 - 以public double getAverage(ArrayList<T extends Number> sensor) 为例。

标签: class generics arraylist average


【解决方案1】:

你应该使用<T extends Number>泛型签名来指定Number类型的类型,另外,你应该使用instanceof关键字。这里有一个简单的虚拟演示;

测试代码

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        List<Integer> integerList = new ArrayList<Integer>();
        List<Double> doubleList = new ArrayList<Double>();
        List<Float> floatList = new ArrayList<Float>();
        
        for(int i = 0; i < 10; i++) 
        {
            integerList.add(new Integer(i+1));
            doubleList.add(new Double(i+1));
            floatList.add(new Float(i+1));
        }
        
        Utility<Integer>    utilityInteger  = new Utility<Integer>(integerList);
        Utility<Double>     utilityDouble   = new Utility<Double>(doubleList);
        Utility<Float>      utilityFloat    = new Utility<Float>(floatList);
        
        System.out.println("Integer average: " + utilityInteger.getAverage());
        System.out.println("Double average : " + utilityDouble.getAverage());
        System.out.println("Float average  : " + utilityFloat.getAverage());
    }
    
    public static class Utility<T extends Number>
    {
        
        // Fields
        private List<T> list;
        private Object  average;
        
        // Constructor
        @SuppressWarnings("unchecked")
        public Utility(List<T> list)
        {
            this.list = list;
            
            T sample = list.get(0);
            if(sample instanceof Double)
            {
                doAverageDouble((List<Double>) list);
            } 
            else if (sample instanceof Integer)
            {
                doAverageInteger((List<Integer>) list);
            }
            else if (sample instanceof Float)
            {
                doAverageFloat((List<Float>) list);
            }
            else
            {
                throw new IllegalStateException("Constructor must be initialiez with either of Double, Integer or Float list");
            }
        }
        
        // Methods
        private void doAverageDouble(List<Double> list) {
            Double sum = new Double(0);
            
            for(Double d : list)
            {
                sum += d;
            }
            
            average = sum/new Double(list.size());
        }

        private void doAverageInteger(List<Integer> list) {
            Integer sum = new Integer(0);
            
            for(Integer d : list)
            {
                sum += d;
            }
            
            average = sum/new Integer(list.size());
        }

        private void doAverageFloat(List<Float> list) {
            Float sum = new Float(0);
            
            for(Float d : list)
            {
                sum += d;
            }
            
            average = sum/new Float(list.size());
        }
        
        Object getAverage()
        {
            return average;
        }
        
    }
}

控制台输出

Integer average: 5
Double average : 5.5
Float average  : 5.5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多