2016-11-29 2 views
0

У меня есть данные, которые можно визуально представить в виде 12 линейных диаграмм (частот) с двумя линейными рядами в каждом из них (с именем «L», «R»), и каждая строка содержит 3000 X & значений Y.В каком объекте хранятся данные?

enter image description here

Теперь я хранить мои данные в 2-х объектах:

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

Я хочу, чтобы хранить свои данные в 1 объекте, но я не знаю, как я могу это сделать. Некоторые псевдокод:

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

Тогда я хочу, чтобы получить X & Y значения массива, указав частоту параметров и ряд линий:

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

Update:

Спасибо всем за ваши идеи. Я пересмотрел свои требования.

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

Что ваш массив 4D (данные) хранения? – user3437460

+0

Я описал свой 4d-массив: частоты, серии, datapoints2d (xy) –

+0

Мой случай выглядит как хеш-таблица со сложным ключом из двух значений: частота и серийное имя –

ответ

0

Почему бы не использовать объекты?

Отказ от ответственности: Это код C#, а не Java, но в основном применяются те же принципы.

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; 

Конечно, не стесняйтесь уточнить структуру для ваших нужд (например, управление 12 наборов данных), но это может быть путь вперед.

+0

Вы уверены, что это может скомпилироваться на Java? – user3437460

+0

Ха-ха, я думал, C#! Эти же понятия применяются –

0

Как насчет того, чтобы просто моделировать, что ваше описание говорит о том, что у вас есть?

У меня есть данные, которые могут быть визуально представлены в виде 12 линейных диаграмм (частот) с серии 2 строки в каждом из них (под названием «L», «R») и каждая серия строка содержит 3000 Х & Y значения

Так у вас есть 12 строк диаграммы:

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

линия диаграмма содержит две серии линии (L и R, который я предполагал, средний левый и правый), и, по-видимому, частоту

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

линия серии содержит 3000 X & Y значения:

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

Точка содержит X и Y

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

    // ... 
} 

Тогда я хочу, чтобы получить X & Y массив значений по с указанием параметров частоты и серии строк

Таким образом, вы бы

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

Да, вы можете хранить их в одном классе. Пусть этот класс будет называться LineChart:

//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

Я думаю, что разделение это в отдельных классах бы сделать вещи проще для вас. Вы можете использовать карту, чтобы получить все диаграммы в один и тот же объект и легко получить заданную диаграмму по частоте.

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

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

Вот как вы бы заполнить данные в свои объекты:

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

Вы можете позже прочитать ваши данные таким образом:

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

Кстати, вы можете использовать LinkedHashMap, если вы хотите, чтобы графики были в том порядке, в котором вы их добавили. – Einar

+0

Thx для идеи. Закрыть, но не так хорошо. –

Смежные вопросы