Как ввести значения координат из хэш-карты с несколькими значениями в javafx point2d? - PullRequest
0 голосов
/ 19 февраля 2020

В настоящее время я пытаюсь создать тепловую карту с помощью JavaFX, и я сохранил название страны и ее координаты в HashMap. Моя идея состояла в том, чтобы вызвать HashMap и получить значение координат стран в Point2D. Так, что я мог бы * l oop строка events = new Point2D[], вместо того, чтобы писать новые точки по отдельности. Я не уверен, что мои мысли о кодировании верны. Однако произошла ошибка (как показано в приведенном ниже коде).

Конструктор Point2D (Список) не определен

Как получить значение координат в HashMap и введите в Point2D вместо вставки самого значения в Point2D (как показано в коде ниже)?

@Override public void init() {
    //Setting country coordinates on the map
    HashMap<String, List<Integer>> countryCoordinates = new HashMap<>();
    Integer[] coordinates = {};
    countryCoordinates.put("china", Arrays.asList(700, 180));
    countryCoordinates.put("Diamond Princess", Arrays.asList(810, 170));
    countryCoordinates.put("Singapore", Arrays.asList(726, 310));
    countryCoordinates.put("Japan", Arrays.asList(810, 170));
    countryCoordinates.put("Hong Kong", Arrays.asList(755, 225));
    countryCoordinates.put("Thailand", Arrays.asList(720, 250));
    .
    .
    .
    .
    pane = new StackPane();
    heatMap = new SimpleHeatMap(1000, 600, ColorMapping.LIME_YELLOW_RED, 40);
    heatMap.setOpacityDistribution(OpacityDistribution.EXPONENTIAL);
    heatMap.setHeatMapOpacity(1);
    events  = new Point2D[] {
        new Point2D(countryCoordinates.get("china")), //The constructor Point2D(List<Integer>) is undefined
        new Point2D(810, 170),

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Решение, использующее Java Stream API , которое создает массив объектов Point2D - поскольку, как видно из кода в вашем вопросе, именно это вы и хотите сделать.

Map<String, List<Integer>> countryCoordinates = new HashMap<>();
countryCoordinates.put("china", Arrays.asList(700, 180));
countryCoordinates.put("Diamond Princess", Arrays.asList(810, 170));
countryCoordinates.put("Singapore", Arrays.asList(726, 310));
countryCoordinates.put("Japan", Arrays.asList(810, 170));
countryCoordinates.put("Hong Kong", Arrays.asList(755, 225));
countryCoordinates.put("Thailand", Arrays.asList(720, 250));
List<Point2D> pts = countryCoordinates.values()
                                      .stream()
                                      .map(lst -> new Point2D(lst.get(0), lst.get(1)))
                                      .collect(Collectors.toList());
Point2D[] points = pts.toArray(new Point2D[]{});
0 голосов
/ 19 февраля 2020

Предполагая, что каждый список имеет размер 2 (который, по-видимому, соответствует приведенному вами коду), все, что вам нужно сделать, чтобы преобразовать один элемент вашей карты в Point2D, - это извлечь два элемента из списка и передайте их конструктору Point2D:

List<Integer> chinaCoords = countryCoordinates.get("china");
Point2D chinaPoint = new Point2D(chinaCoords.get(0), chinaCoords.get(1));

Поскольку вы делаете это неоднократно, вместо того, чтобы писать этот код несколько раз, вероятно, более удобно определить вспомогательный метод для этого:

private Point2D asPoint2D(List<Integer> coordList) {
    return new Point2D(coordList.get(0), coordList.get(1));
}

И тогда код в вашем методе init() выглядит так:

events = new Point2D[] {
    asPoint2D(countryCoordinates.get("china")),
    ...
};

Более продвинутый (но более чистый) вариант:

Если вы знакомы с API потоков и лямбда-выражения, вы даже можете сделать это без определения явной функции (или явных циклов и т. д. c):

events = countryCoordinates().values().stream()
    .map(list -> new Point2D(list.get(0), list.get(1)))
    .collect(Collectors.toList())
    .toArray(new Point2D[countryCoordinates.size()]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...