如何将多值hashmap中的坐标值输入javafx point2d?

如何将多值hashmap中的坐标值输入javafx point2d?,java,javafx,Java,Javafx,目前,我正在尝试使用JavaFX创建热图,并且我已经将国家名称及其坐标存储到HashMap中。我的想法是调用HashMap,将国家的坐标值输入Point2D。这样我就可以循环行events=newpoint2d[],而不是单独编写新的点。我不确定我对编码的想法是否正确。但是,出现了一个错误(如下面的代码所示) 构造函数点2D(列表)未定义 如何在HashMap中获取坐标值并将其输入点2D,而不是将值本身插入点2D(如下代码所示) @重写公共void init(){ //在地图上设置国家坐标 Ha

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

构造函数点2D(列表)未定义

如何在
HashMap
中获取坐标值并将其输入
点2D
,而不是将值本身插入
点2D
(如下代码所示)

@重写公共void init(){
//在地图上设置国家坐标
HashMap countryCoordinates=新HashMap();
整数[]坐标={};
countryCoordinates.put(“china”,Arrays.asList(700180));
countryCoordinates.put(“钻石公主”,Arrays.asList(810170));
countryCoordinates.put(“Singapore”,Arrays.asList(726310));
countryCoordinates.put(“日本”,Arrays.asList(810170));
countryCoordinates.put(“hongkong”,Arrays.asList(755225));
countryCoordinates.put(“泰国”,Arrays.asList(720250));
.
.
.
.
窗格=新的堆栈窗格();
热图=新的SimpleHeatMap(1000600,ColorMapping.LIME\u YELLOW\u RED,40);
热图.设定不透明分布(不透明分布.指数);
热图设置热图不透明度(1);
事件=新点2D[]{
new Point2D(countryCoordinates.get(“china”),//构造函数Point2D(List)未定义
新的Point2D(810170),

假设每个列表的大小都是2(从您发布的代码来看,这似乎是真的),将地图的单个元素转换为
点2D
所需做的就是从列表中提取两个元素,并将它们传递给
点2D
构造函数:

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

更高级(但更干净)的选项:

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

一个使用Java的解决方案,它创建了一个
Point2D
对象数组——从您问题中的代码中可以看出,这就是您想要做的

Map countryCoordinates=new HashMap();
countryCoordinates.put(“china”,Arrays.asList(700180));
countryCoordinates.put(“钻石公主”,Arrays.asList(810170));
countryCoordinates.put(“Singapore”,Arrays.asList(726310));
countryCoordinates.put(“日本”,Arrays.asList(810170));
countryCoordinates.put(“hongkong”,Arrays.asList(755225));
countryCoordinates.put(“泰国”,Arrays.asList(720250));
列表pts=countryCoordinates.values()
.stream()
.map(lst->newpoint2d(lst.get(0),lst.get(1)))
.collect(Collectors.toList());
Point2D[]points=pts.toArray(新的Point2D[]{});

Class
Point2D
只有一个。您可以创建一个扩展
Point2D
的类,并添加另一个构造函数,即接受
列表的类)类声明示例:
公共类My2dPoint扩展Point2D
和构造函数示例:
公共My2dPoint(列表坐标)
谢谢,还有一个问题,我尝试创建另一个扩展到Point2D的类并创建另一个构造函数。但是,我收到以下错误“隐式超级构造函数Point2D()是未定义的。必须显式调用另一个构造函数“这里的子类似乎有些过分:它提供的只是一个额外的构造函数(没有额外的功能或状态)。只需定义一个方法,该方法接受一个
列表
,并返回一个
点2D
。因此,我需要重复第一个代码,因为它不仅仅是中国?@DeniseTay可以定义一次该方法,然后用其他国家的重复代码替换
。对不起,我的意思是列表chinaCoords=CountryCoords.get(“中国”);Point2D chinaPoint=new Point2D(chinaCoords.get(0),chinaCoords.get(1));我需要重复这个吗?@DeniseTay你根本不需要。这只是为了说明这个想法。啊,我明白了,谢谢,但是有没有办法循环事件=new 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));
}
events = new Point2D[] {
    asPoint2D(countryCoordinates.get("china")),
    ...
};
events = countryCoordinates().values().stream()
    .map(list -> new Point2D(list.get(0), list.get(1)))
    .collect(Collectors.toList())
    .toArray(new Point2D[countryCoordinates.size()]);