2016-05-18 18 views
4

Ich möchte eine benutzerdefinierte Klasse MultipleResult, die ArrayList s verschiedener Typen enthalten kann, aber ich bin mir nicht sicher, wie dies zu implementieren ist. Ich möchte mehrere ArrayList in ein Objekt einkapseln, aber manchmal werde ich ArrayList<Float> und andere Male ArrayList<Integer> verwenden. Ich habe versucht, die generische Eingabe als ArrayList<Object> erklärt, aber das gibt mir einen incompatible types Fehler, wenn ich tue:ArrayList mit beliebigen Objekten

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

wo das Verfahren reduce mehr ArrayList<Float> erzeugt und setzt sie in ein MultipleResult Objekt. Dies ist die MultipleResult Klasse:

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

Und hier ist die reduce Methode:

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 könnten Sie versuchen, 'Nummer' zu verwenden. – Mena

+3

Oder vielleicht [** Generische Typen **] (https://docs.oracle.com/javase/tutorial/java/generics/types.html) – Kaostias

Antwort

4

Wie @Kaostias in Kommentar vorgeschlagen können Sie machen MultipleResultgeneric wie folgt

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

und Verwendung es folgt wie folgt

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

können Sie tun das mit Generika. Zum Beispiel:

public class MultipleResult<T> { 
    ... 
    } 

und dann:

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

können Sie machen MultipleResult sich parametrisch, mit, dass Parametertyp die darin enthaltenen Felder eingeben.

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

    public MultipleResult(List<T> arrayA, ...) { 
     this.resultA = arrayA; 
    } 
} 
Verwandte Themen