Как я могу получить необходимые ключи из общего количества ключей, указанных на карте?

Мне требуется ок. 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 ответа

Ну, просто создайте новую переменную, которую вы увеличиваете на каждой итерации. Когда значение этой переменной достигнет 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, но вместо завершения цикла он просто перейдет к следующей итерации.

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

Наилучшим решением будет повторная выборка ваших входных данных и вектора времени.

Но если вы хотите быть простым, вы можете попробовать что-то вроде этого:

  • Всегда добавляйте начальную конечную конечную точку данных
  • Для внутренних точек данных рассчитайте прореживание

пример

Этот пример всегда будет производить LineChart с 20 узлами независимо от того, сколько точек данных вы вводите массив имеет.

Примечание: это решение далеко не лучшее, что вы можете иметь, и в значительной степени основано на том, что векторы входных данных имеют одинаковый вектор времени. Это также влияет на результат, что размер шага вектора времени является фиксированным.

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

В примере используются массивы для хранения данных, но они действительно похожи на вашу структуру данных (используя размер Set и цикл со старым добрым для цикла).

Другие вопросы по тегам