【问题标题】:ArrayList containing arbitrary objects包含任意对象的 ArrayList
【发布时间】:2016-05-18 15:21:17
【问题描述】:

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

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

其中reduce 方法生成多个ArrayList&lt;Float&gt; 并将它们放入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);
}

【问题讨论】:

标签: java android arraylist


【解决方案1】:

根据@Kaostias 的评论建议,您可以按如下方式制作MultipleResult generic

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

【讨论】:

    【解决方案2】:

    我不确定,但我认为在您的情况下泛型类型很有用。例如:

    ArrayList<T> list = new ArrayList<T>();
    

    欲了解更多信息,请使用下面的链接:

    https://docs.oracle.com/javase/tutorial/java/generics/types.html

    How to create a generic array?

    【讨论】:

      【解决方案3】:

      您可以使用泛型来做到这一点。例如:

        public class MultipleResult<T> {
         ...
        }
      

      然后:

       MultipleResult<Integer> multipleResult = new MultipleResult<>();
      

      【讨论】:

        【解决方案4】:

        您可以使 MultipleResult 本身参数化,使用该参数类型来键入其包含的数组。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-10
          • 2020-04-13
          • 2012-11-14
          • 2010-12-18
          • 2014-12-11
          • 1970-01-01
          相关资源
          最近更新 更多