遍历具有重复值的Map,并标识共享这些值的键

时间:2019-02-26 13:58:03

标签: java dictionary set

我有一个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,并且仅添加到需要添加的{}中。

我的代码:

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]]

2 个答案:

答案 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]