我有一个Map
类型的<String, Set<Object>>
,其中包含名称和坐标(Double = X,Y
)。这些值用于创建图形。我遇到的问题是某些点共享相同的坐标,因此,它们在一个点出现在另一个点上时几乎看不见。为了解决这个问题,我想遍历Set
并仅将0.01
点增加X
。
虽然可以大大解决问题,但这并不是一个完美的解决方案,因为有些观点仍然与其他观点发生冲突。
有没有一种方法可以一次在Map
中搜索特定范围的值,例如0.1-0.2, 0.2-0.3, etc.
并确定在这些范围内出现什么keys
?然后,我假设我可以增加在特定范围内共享相同X
的那些。这样可以防止在0.01
的所有X
中添加key
,并且仅添加到需要添加的{1>}中。
我的代码:
double i=0.01;
for (Map.Entry<String, Set<Coordinates>> serie : nameToCoordinates.entrySet()) {
List<Double> xData = new ArrayList<>();
List<Double> yData = new ArrayList<>();
for (Coordinates coord : serie.getValue()) {
xData.add(coord.getX()+i);
yData.add(coord.getY());
}
i=i+0.01;
chart.addSeries(serie.getKey(), xData, yData);
}
输入示例:
Point1 [[0.1,0.1,0.1,0.1,0.1,0.1],[0.2,0.3,0.4,0.5,0.6,0.7]]
Point2 [[0.1,0.1,0.1,0.1] ,[0.4,0.5,0.6,0.7]]
Point3 [[0.1,0.1] ,[0.6,0.7]]
答案 0 :(得分:0)
您可以创建一个看起来像这样的函数。它会退还所有在最小和最大范围之间具有x或y坐标的键。您只需要对它返回的键列表做些事情。就像增加属于该键的值。 当然,可以稍微更改功能以适合您正在使用的对象的类型:p。祝好运!
private List<String> getKeyRange(Map<String, List<Object> map, double min, double max){
List<String> keys = new List<>();
for(String key : map.getKeys()){
Object coord = map.get(key);
if( (coords.getX() > min && coords.getX() < max) || (coord.getX() > min && coord.getY() < max) ){
keys.add(key);
}
}
return keys;
}
答案 1 :(得分:0)
Reg。使用Map进行这些操作时,您将需要自己实现它,特别是如果您正在使用一些自定义对象(例如,请参见下面的内容),如何定义事物:
坐标对象(包含X和Y的double值)
class CoordObj {
double Xval;
double Yval;
public CoordObj(double xval, double yval) {
Xval = xval;
Yval = yval;
}
public double getXval() {
return Xval;
}
public double getYval() {
return Yval;
}
@Override
public String toString() {
return "coord: ["+Xval+"," + Yval +"]";
}
}
出于测试目的,我创建了生成器函数来填充坐标对象
HashMap<Integer, CoordObj> dataMap = new HashMap<>();
for (int i = 0; i < itemCount; i++) {
CoordObj item = new CoordObj(generateDouble(), generateDouble());
dataMap.put(i, item);
}
return dataMap;
然后按范围内的X坐标进行过滤的工作方式如下(可以很容易地自定义为按Y坐标进行过滤;相似的部分可用于比较两个坐标成员-例如带有内部循环)
public static void filterCoordsByX(Map<Integer,CoordObj> data,double min, double max) {
ArrayList<Integer> foundKeys = new ArrayList<>();
for (Map.Entry<Integer, CoordObj> entryChecked : data.entrySet()){
if(entryChecked.getValue().getXval() > min && entryChecked.getValue().getXval() < max ) {
foundKeys.add(entryChecked.getKey());
}
}
System.out.println("for min: " + min + ", and max: " + max + " found keys:" + foundKeys.toString());
System.out.println("backward check:");
for (int i = 0; i < foundKeys.size(); i++) {
System.out.println("key: " + foundKeys.get(i) +", value: " + data.get(foundKeys.get(i)));
}
}
测试结果
generated: 3.61911823406948
generated: 4.970659057619206
generated: 0.19778377925564672
generated: 6.223897657222775
generated: 9.86588783431928
generated: 4.211157245481315
generated: 2.4889283969102562
generated: 9.253484002587617
generated: 5.003925383598808
generated: 0.9279033924004261
for min: 2.0, and max: 4.0 found keys:[0, 3]
backward check:
key: 0, value: coord: [3.61911823406948,4.970659057619206]
key: 3, value: coord: [2.4889283969102562,9.253484002587617]