0

私は約必要です。100 個以上のキーを含む提供されたデータからの 20 個のキー。

Set<Entry<Double,PosTvector>> set = realPosDataMap.entrySet();

Iterator<Entry<Double, PosTvector>> i1 = set.iterator();

Map.Entry<Double,PosTvector> map;

while(i1.hasNext()) {
    map = i1.next();

    Double xvalue = map.getKey();
    PosTvector yvalue = map.getValue();
    PosTvector yvalue1 = map.getValue();
    PosTvector yvalue2 = map.getValue();                       
    Data<String, Number> data = new Data<String, Number>(xvalue.toString(), yvalue.state[0]);
    Data<String, Number> data1 = new Data<String, Number>(xvalue.toString(), yvalue1.state[1]);
    Data<String, Number> data2 = new Data<String, Number>(xvalue.toString(), yvalue2.state[2]);
  //Data<String, Number> verticalMarker = new Data<String, Number>(xvalue.toString(), 0);

    series.getData().add(data);   
    series1.getData().add(data1); 
    series2.getData().add(data2);


}   
series.setName("X-Position");
series1.setName("Y-Position");
series2.setName("Z-Position");


lineChart.getData().addAll(series, series1, series2);

グラフ上の100個の値すべてではなく、20個のキーと値のみを折れ線グラフに表示したい。どうすればこれを達成できますか? 前もって感謝します。

4

2 に答える 2

0

よくわからないので、データを間引きしたい場合の話をします。

最善の解決策は、入力データと時間ベクトルを再サンプリングすることです。

しかし、シンプルにしたい場合は、次のようなことを試すことができます。

  • 常に始点終点のデータポイントを追加
  • 内部データ ポイントについては、デシメーションを計算します

この例では、入力配列に含まれるデータ ポイントの数に関係なく、常にLineChart20 ノードの が生成されます。

注:このソリューションは、可能な限り最善の方法ではなく、入力データ ベクトルが同じ時間ベクトルを持つことに大きく依存しています。時間ベクトルのステップ サイズが固定されていることも結果に影響します。

public class ChartingApp extends Application {

    @Override
    public void start(Stage stage) throws Exception {

        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);

        // Size of the input data
        int dataCount = 777;

        // One X axis two Y axis
        double[] xValues = new double[dataCount];
        double[] y1Values = new double[dataCount];
        double[] y2Values = new double[dataCount];

        // Generate some initial data
        Random randomGenerator = new Random();

        for (int i = 0; i < dataCount; i++) {
            xValues[i] = i;
            y1Values[i] = randomGenerator.nextInt(200);
            y2Values[i] = randomGenerator.nextInt(200);
        }

        // Amount of nodes to display
        int valueCountToDisplay = 20;

        Series<Number, Number> series1 = new Series<Number, Number>();
        Series<Number, Number> series2 = new Series<Number, Number>();

        // The first element is always added
        series1.getData().add(new Data<Number, Number>(xValues[0], y1Values[0]));
        series2.getData().add(new Data<Number, Number>(xValues[0], y2Values[0]));

        // Generate the inner nodes
        double elementToPick = Math.floor((dataCount - 2) / (valueCountToDisplay - 2));

        for (int i = 1; i < dataCount - 1; i++) {
            if (i % elementToPick == 0) {
                series1.getData().add(new Data<Number, Number>(xValues[i], y1Values[i]));
                series2.getData().add(new Data<Number, Number>(xValues[i], y2Values[i]));
            }
        }

        // The last element is always added
        series1.getData().add(new Data<Number, Number>(xValues[dataCount - 1], y1Values[dataCount - 1]));
        series2.getData().add(new Data<Number, Number>(xValues[dataCount - 1], y2Values[dataCount - 1]));

        Scene scene = new Scene(lineChart, 800, 600);
        lineChart.getData().addAll(series1, series2);

        stage.setScene(scene);
        stage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

}

結果は次のとおりです。

ここに画像の説明を入力

背後にあるロジックは、次のように要約できます。

double[] createSparseArray(double[] inputData, int arraySize) {
    List<Double> sparseList = new ArrayList<Double>();

    sparseList.add(inputData[0]);

    double elementToPick = Math.floor((inputData.length - 2) / (arraySize - 2));

    for (int i = 1; i < inputData.length - 1; i++) {
        if (i % elementToPick == 0)
            sparseList.add(inputData[i]);
    }
    sparseList.add(inputData[arraySize - 1]);
    return sparseList.stream().mapToDouble(d -> d).toArray();
}

この例では配列を使用してデータを格納していますが、実際のデータ構造と似ています ( size ofSetを使用し、古き良き for ループでループします)。

于 2016-06-20T10:13:22.177 に答える
0

さて、反復ごとに増加する新しい変数を作成するだけです。この変数の値が 20 に達すると、ループから抜け出します。このような:

int amount = 0;
while(i1.hasNext()) {
    amount += 1;
    if(amount == 20) {
        break;
    }
    ...
}

わからない場合break:含まれているループを離れるキーワードです。

編集

私は最初にあなたを誤解しました。これが(うまくいけば)正しい答えです。上記の解決策の代わりに、次のようにします。

while(i1.hasNext()) {
    map = i1.next();
    if(map.getKey() > 20 || map.getKey() < 1) {
        continue;
    }
    ...
}

このコードは、エントリのキーが 1 から 20 の間であるかどうかをチェックします。そうでない場合は、次のエントリがチェックされます。そのために、continue- に似たキーワードを使用しbreakますが、ループを終了する代わりに、次の繰り返しにジャンプします。

于 2016-06-20T11:29:54.723 に答える