有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

包含任意对象的java ArrayList

我想创建一个自定义类MultipleResult,它可以包含不同类型的ArrayList,但我不确定如何实现它。我想将多个ArrayList封装到一个对象中,但有时我会使用ArrayList<Float>,有时使用ArrayList<Integer>。 我已尝试将泛型输入声明为ArrayList<Object>,但这样做时会出现incompatible types错误:

MultipleResult arrays = reduce(theInputValues,10);
ArrayList<Float> arrayA =arrays.getResultA();

其中,方法reduce生成几个ArrayList<Float>,并将它们放入MultipleResult对象中。这是MultipleResult类:

import java.util.ArrayList;

public class MultipleResult {

    private ArrayList<Object> resultA;
    private ArrayList<Object> resultB;
    private ArrayList<Object> resultC;
    private ArrayList<Object> resultD;

    public MultipleResult(ArrayList<Object> arrayA, ArrayList<Object> arrayB) {
        resultA=arrayA;
        resultB=arrayB;
    }

    public MultipleResult(ArrayList<Object> arrayA, ArrayList<Object> arrayB,
                          ArrayList<Object> arrayC, ArrayList<Object> arrayD) {
        resultA=arrayA;
        resultB=arrayB;
        resultC=arrayC;
        resultD=arrayD;
    }

    public ArrayList<Object> getResultA() {
        return resultA;
    }

    public ArrayList<Object> getResultB() {
        return resultB;
    }

    public ArrayList<Object> getResultC() {
        return resultC;
    }

    public ArrayList<Object> getResultD() {
        return resultD;
    }
}

下面是reduce方法:

private MultipleResult reduce(ArrayList<Float> theInput,Integer n){

    ArrayList<Float> opens=new ArrayList<>();
    ArrayList<Float> highs=new ArrayList<>();
    ArrayList<Float> lows=new ArrayList<>();
    ArrayList<Float> closes=new ArrayList<>();

    Integer N = theInput.size();

    for (int i=0;i<n;i++){

        Integer nMin = Math.round((N/n)*i);
        Integer nMax = Math.round((N/n)*(i+1))-1;

        Float open=theInput.get(nMax);
        Float high=theInput.get(nMin);
        Float low=theInput.get(nMin);
        Float close=theInput.get(nMin);

        for(int j=nMin;j<=nMax;j++){
            if (theInput.get(j)>high){
                high=theInput.get(j);
            }
            if (theInput.get(j)<low){
                low=theInput.get(j);
            }
        }

        opens.add(i,open);
        highs.add(i,high);
        lows.add(i,low);
        closes.add(i,close);

    }

    return new MultipleResult(opens,highs,lows,closes);
}

共 (4) 个答案

  1. # 1 楼答案

    您可以使用泛型来实现这一点。例如:

      public class MultipleResult<T> {
       ...
      }
    

    然后:

     MultipleResult<Integer> multipleResult = new MultipleResult<>();
    
  2. # 2 楼答案

    正如@Kaostias在评论中所建议的,您可以按如下方式制作MultipleResult{a1}

    public class MultipleResult<T> {
    
        private ArrayList<T> resultA;
        private ArrayList<T> resultB;
        private ArrayList<T> resultC;
        private ArrayList<T> resultD;
    
        public MultipleResult(ArrayList<T> arrayA, ArrayList<T> arrayB) {
            resultA=arrayA;
            resultB=arrayB;
        }
    
        public MultipleResult(ArrayList<T> arrayA, ArrayList<T> arrayB,
                              ArrayList<T> arrayC, ArrayList<T> arrayD) {
            resultA=arrayA;
            resultB=arrayB;
            resultC=arrayC;
            resultD=arrayD;
        }
    
        public ArrayList<T> getResultA() {
            return resultA;
        }
    
        public ArrayList<T> getResultB() {
            return resultB;
        }
    
        public ArrayList<T> getResultC() {
            return resultC;
        }
    
        public ArrayList<T> getResultD() {
            return resultD;
        }
    }
    

    并按如下方式使用它

    private MultipleResult<Float> reduce(ArrayList<Float> theInput,Integer n){
    
        ArrayList<Float> opens=new ArrayList<>();
        ArrayList<Float> highs=new ArrayList<>();
        ArrayList<Float> lows=new ArrayList<>();
        ArrayList<Float> closes=new ArrayList<>();
    
        Integer N = theInput.size();
    
        for (int i=0;i<n;i++){
    
            Integer nMin = Math.round((N/n)*i);
            Integer nMax = Math.round((N/n)*(i+1))-1;
    
            Float open=theInput.get(nMax);
            Float high=theInput.get(nMin);
            Float low=theInput.get(nMin);
            Float close=theInput.get(nMin);
    
            for(int j=nMin;j<=nMax;j++){
                if (theInput.get(j)>high){
                    high=theInput.get(j);
                }
                if (theInput.get(j)<low){
                    low=theInput.get(j);
                }
            }
    
            opens.add(i,open);
            highs.add(i,high);
            lows.add(i,low);
            closes.add(i,close);
    
        }
    
        return new MultipleResult<Float>(opens,highs,lows,closes);
    }
    
  3. # 3 楼答案

    可以将MultipleResult本身设置为参数化,使用该参数化类型键入其包含的数组

    public class MultipleResult<T extends Number> {
        private List<T> resultA = new ArrayList<>();
    
        public MultipleResult(List<T> arrayA, ...) {
            this.resultA = arrayA;
        }
    }