首页 > 解决方案 > 如何将多值哈希图中的坐标值输入到 javafx point2d?

问题描述

目前,我正在尝试使用 JavaFX 创建热图,并将国家名称及其坐标存储到HashMap. 我的想法是调用HashMap并将国家的坐标值放入Point2D. 这样我就可以循环线路events = new Point2D[],而不是单独编写新点。我不确定我的编码想法是否正确。但是,出现了错误(如下面的代码所示)。

构造函数 Point2D(List) 未定义

如何获取坐标值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),

标签: javajavafx

解决方案


假设每个列表的大小为 2(从您发布的代码看来是正确的),将地图的单个元素转换为 a 所需要做的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")),
    ...
};

更高级(但更清洁)的选项:

如果您熟悉 Streams API 和 lambda 表达式,您甚至可以在不定义显式函数(或显式循环等)的情况下执行此操作:

events = countryCoordinates().values().stream()
    .map(list -> new Point2D(list.get(0), list.get(1)))
    .collect(Collectors.toList())
    .toArray(new Point2D[countryCoordinates.size()]);

推荐阅读