Как я могу получить необходимые ключи из общего количества ключей, указанных на карте?
Мне требуется ок. 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
и цикл со старым добрым для цикла).