2016-05-18 9 views
4

ArrayListの異なるタイプを含むカスタムクラスMultipleResultを作成したいのですが、これを実装する方法がわかりません。 1つのオブジェクトに複数のArrayListをカプセル化したい場合がありますが、ときどきArrayList<Float>と他の時はArrayList<Integer>を使用します。 私はArrayList<Object>などの一般的な入力を宣言しようとしているが、これは私がやるincompatible typesエラー与える:任意のオブジェクトを含むArrayList

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

方法はreduceは、いくつかのArrayList<Float>を生成し、MultipleResultオブジェクトにそれらを置きます。これはMultipleResultクラスです:@Kaostiasによってコメントで示唆したように

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

及び使用を次のようにMultipleResultgenericを作ることができます

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

TL; DRあなたは 'Number'を試してみるかもしれません。 – Mena

+3

または[**汎用タイプ**](https://docs.oracle.com/javase/tutorial/java/generics/types.html) – Kaostias

答えて

4

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

あなたはジェネリックを使用していることを行うことができます。

public class MultipleResult<T> { 
    ... 
    } 

、その後:たとえば

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

あなたはそれに含まれる配列を入力することパラメトリックタイプを使用して、MultipleResult自体はパラメトリックにすることができます。

public class MultipleResult<T extends Number> { 
    private List<T> resultA = new ArrayList<>(); 

    public MultipleResult(List<T> arrayA, ...) { 
     this.resultA = arrayA; 
    } 
} 
関連する問題