2016-11-29 2 views
0

Ich habe eine Daten, die visuell dargestellt werden kann als 12 Liniendiagramme (Frequenzen) mit 2 Zeilenreihen in jedem (benannt "L", "R") und jede Zeile enthält 3000 X & Y-Werte.In welchem ​​Objekt speichern meine Daten?

enter image description here

Nun meine Daten in 2 Objekte Ich Speicherung:

double[][][][] data = new double[12][2][3000][2]; 
double[] frequencies = new double[]{2.22, 2.3, 2.39, 
2.48, 2.57, 2.67, 2.77, 2.89, 3.0, 3.18, 3.37, 3.57}; 

ich meine Daten in 1 Objekt speichern möchten, aber ich weiß nicht, wie ich das tun kann. Einige Pseudo-Code:

List<Object[]> data = new ArrayList<Object[]>(); 
double[][] xyValues = new double[3000][2]; 
data.add{2.22, 'L', xyValues}; 
data.add{2.22, 'R', xyValues}; 
data.add{2.3, 'L', xyValues}; 
data.add{2.3, 'R', xyValues}; 
.... 

Dann möchte ich durch Angabe von Parametern Frequenz und Linienserie X & Y-Werte Array abzurufen:

double[][] xyValues = getXYValuesFromData(2.3, 'L'); 

Update:

Dank allen für Ihre Ideen. Ich habe meine Anforderungen überarbeitet.

import java.util.ArrayList; 
import java.util.Random; 

public class Test { 

public static void main(String[] args) { 

    //class for storing my data 
    ScanData myData = new ScanData(); 

    //-----------------------adding data------- 
    //There are 4 possible series(L, R, I, V), I want put them independently, 
    // so e.g. I can put just any one or any two 
    myData.put(2.22, 'L', new XYvalues()); 
    myData.put(2.22, 'R', new XYvalues()); 
    myData.put(2.22, 'I', new XYvalues()); 
    myData.put(2.22, 'V', new XYvalues()); 

    myData.put(2.48, 'I', new XYvalues()); 
    myData.put(3.57, 'I', new XYvalues()); 

    //----------------------getting data-------- 
    //get xyValues of first frequency in my data and R-serie: 
    double[][] xyValuesRserie = myData.freqIndex(0).r(); 
    //get frequency value of first frequency: 
    double freq = myData.freqIndex(0).freq(); //2.22 

    //get xyValues of l-serie by frequency value 
    double[][] array = myData.freq(5.22).l();//[3000][2] 
} 

} 

class XYvalues{ 

double[][] XYValues(){ 

    double[][] xyValues = new double[3000][2]; 
    Random random = new Random(); 

    for (int i=0; i< xyValues.length; i++){ 
     xyValues[i][0] = (double) (i - xyValues.length/2)*10; 
     xyValues[i][1] = (double) random.nextDouble(); 
    } 

    return xyValues; 

} 

} 

class ScanData{ 

//????? 

} 
+0

Was ist Ihre 4D Array (Daten) zu speichern? – user3437460

+0

Ich beschrieb meine 4d-Array: Frequenzen, Serien, Datenpunkte2d (xy) –

+0

Mein Fall sieht aus wie Hash-Tabelle mit komplexen Schlüssel aus zwei Werten: Häufigkeit und Serie Name –

Antwort

0

Warum nicht Objekte verwenden?

Haftungsausschluss: Dies ist C# -Code, nicht Java, aber im Wesentlichen gelten die gleichen Prinzipien.

class DataPoint { 
    public double Frequency {get; set;} 
    public double Left {get; set;} 
    public double Right {get; set;} 
    public DataPoint(double freq, double l, double r) { 
     Frequency = freq; 
     Left = l; 
     Right = r; 
    } 
    //Can insert sorting comparator functions here 
    // and inherit from IComparable for sorting in lists 
} 

List<DataPoint> dataset = new List<DataPoint>(); 
dataset.add(new DataPoint(2.22, 1234, 5678)); 
dataset.add(new DataPoint(2.3, 9876, 5432)); 

//Trying to get doubles based on equality can fail due to how doubles are stored, 
// consider doing an absolute difference with some epsilon. 
DataPoint point = dataset.Find(p => p.Frequency == 2.22); 
double left = point.Left; 
double right = point.Right; 

Natürlich fühlen sich frei, für Ihre Bedürfnisse auf die Struktur zu erarbeiten (zB 12 Datensätze verwalten), aber dies kann nach vorne ein Weg sein.

+0

Sind Sie sicher, dass dies in Java kompilieren kann? – user3437460

+0

Haha, ich dachte C#! Es gelten die gleichen Konzepte. –

0

Wie wäre es, nur zu modellieren, was Ihre Beschreibung über das, was Sie haben, sagt?

Ich habe ein Datum, die als 12 Liniendiagramme (Frequenzen) mit 2-Line-Serie in jedem (mit dem Namen 'L', 'R') und jede Zeile Serie enthält 3000 X & Y

Werte dargestellt werden visuell können

So haben Sie 12 Liniendiagramme:

List<LineChart> lineCharts = new ArrayList<>(12); 

ein Liniendiagramm enthält zwei Line-Serie (L und R, die ich meine, links und rechts davon ausgegangen), und offenbar eine Frequenz

public class LineChart { 
    private double frequency; 
    private LineSerie leftSerie; 
    private LineSerie rightSerie; 
    // ... 
} 

Eine Linie Serie enthält 3000 X & Y Werte:

public class LineSerie { 
    private List<Point> values; 
    // ... 
} 

ein Punkt ein X enthält, und ein Y

public class Point { 
    private double x; 
    private double y; 

    // ... 
} 

Dann möchte ich X abzurufen & Y Array Werte, die durch Spezifizierung Parameter Frequenz und Linie Serie

So würden Sie

LineSerie lineSerie = 
    lineCharts.stream() 
       .filter(chart -> chart.getFrequency() == 2.3) 
       .findAny() 
       .map(LineChart::getLeftSerie) 
       .orElseThrow(() -> new IllegalStateException("no chart with frequency 2.3"); 
0

Ja, können Sie sie in einer Klasse speichern. Lassen Sie die Klasse LineChart genannt werden:

//for example only 
public class Runner{ 
    public static void main(String[] args){ 
     ArrayList<LineChart> charts = new ArrayList<Linechar>(); 
     charts.add(new LineChart()); //add your 12 line charts here.. 
    } 
} 

public class LineSeries 
{ 
    private String name;   //e.g "L", "R" 
    private List<Point> points; //to store your 3000 x,y points 

} 

public class LineChart 
{ 
    private List<LineSeries> lineSeriesList; //to store your "L"/"R" line series 
} 
1

Ich denke, das Splitting in getrennten Klassen würde für Sie die Dinge einfacher. Sie können eine Karte verwenden, um alle Diagramme in ein und dasselbe Objekt zu übertragen und ein Diagramm nach Häufigkeit zu erhalten.

class Chart { 
    final double[] leftData; 
    final double[] rightData; 

    Chart(double[] leftData, double[] rightData) { 
     this.leftData = leftData; 
     this.rightData = rightData; 
    } 
} 

Hier ist, wie Sie Daten in Ihre Objekte füllen würde:

Map<Double, Chart> charts = new HashMap<>(); 
charts.put(2.22, new Chart(<leftData goes here>, <rightData goes here>)); 
charts.put(2.3, new Chart(<leftData goes here>, <rightData goes here>)); 

Sie können Ihre Daten auf diese Weise später lesen:

Chart chart = charts.get(2.22); 
double[] leftData = chart.leftData; 
double[] rightData = chart.rightData; 
+0

BTW, Sie können LinkedHashMap verwenden, wenn die Diagramme in der Reihenfolge angezeigt werden sollen, in der Sie sie hinzugefügt haben. – Einar

+0

Thx für die Idee. Nah, aber nicht so gut. –

Verwandte Themen