如何从地图中给出的总密钥中获取所需的密钥?

时间:2016-06-20 08:55:46

标签: java javafx charts treemaps

我需要约。提供的数据中有20个密钥,包含100多个密钥。

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

我想在折线图上只显示20个键,并且值不是图表上的所有100个值。你可以帮助我,我们怎样才能实现这一目标?提前谢谢。

2 个答案:

答案 0 :(得分:0)

我不知道我理解得很清楚所以当你想要抽取数据时我会谈到这个案例。

最佳解决方案是重新采样输入数据和时间向量。

但如果你想变得简单,你可以尝试这样的事情:

  • 始终添加起始结束数据点
  • 对于内部数据点计算抽取

示例

此示例将始终生成一个包含20个节点的LineChart,与您输入数组的数据点无关。

注意:这个解决方案远远不是你能拥有的最好的解决方案,并且在很大程度上依赖于输入数据向量具有相同的时间向量。它也会影响时间向量的步长固定的结果。

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

}

结果是:

enter image description here

背后的逻辑可以概括为:

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

该示例使用数组来存储数据,但它与您的数据结构非常相似(使用Set的{​​{3}}并使用旧的for循环进行循环)。

答案 1 :(得分: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的关键字,但不是结束循环,而是跳转到下一次迭代。