在多地图中仅添加重复值(设置和变量)

时间:2014-06-10 18:19:02

标签: java guava multimap

这是我之前的问题How to add values in a multi map

的扩展

我能够在多地图中添加值,但问题是当它找到重复的键时,它应该添加与其键对应的值。然后,一旦当前密钥更改为另一个数字,它应该使总和= 0.00,然后使用不同的重复密钥号重新开始。在下面的代码中,我不知道在何处使sum = 0.00以及在何处打印该值,因此它只打印出具有总计值的键。

以下是代码 (更新代码)

    // create a Map()
 Map<String, String> readValuemap = new LinkedHashMap<String,String>();
  String val = null;
  for(int i =0; i< 256;i++){
       for(int y=0; y< 256; y++){

             //reading in the values.
            String x = image.getLocationAsString(i, y);
        String n = image.getValueAsString(i, y);

        //Parsing them into "key" and "value".
        String delim = ", value=";
        String [] tokens = n.split(delim);
        double num = Double.parseDouble(tokens[1]);
        String stringNum = String.valueOf(num);

        String [] t = x.split("r=");
        String[] b = t[1].split(" mm/c");
        //System.out.print("Meet b:    "+b[0]);
        double radius = Double.parseDouble(b[0]);
        String stringRad = String.valueOf(radius);
        //System.out.println("The radius:   "+radius);


        //retrieve the current value for the key from the map.
        val = readValuemap.get(radius);
        System.out.println(val);
        //if null, just put the value into the map.
        if(val == null){
             readValuemap.put(stringRad, stringNum);
             System.out.println("new if; "+val);

        }
        else{   
             //if not null, add the current value to the new value (the one that you just read in) 
                       //and store the sum in the map.

        double v = Double.parseDouble(val);
        v += num;
        String newValue = String.valueOf(v);
        System.out.println("new value; "+newValue);
        readValuemap.put(stringRad, newValue);

        }

      }
    }

            System.out.println("-------------Printing out the values----------------");
            Iterator iter = readValuemap.entrySet().iterator();
            while(iter.hasNext()){
                Map.Entry pairs = (Map.Entry)iter.next();
                System.out.println(pairs.getKey() + " = "+ pairs.getValue());
            }

所以基本上它应该是这样的:multimap包含:

1.36 = 59.0
1.36 = 65.0
1.35 = 56.0
1.35 = 71.0
1.34 = 64.0
1.34 = 75.0
1.33 = 59.0

之后它应该是这样的(它应该在multimap中找到任何重复的键并添加值):

1.36 = 124.0
1.35 = 127.0
1.34 = 139.0
1.33 = 59.0

现在写下它只是添加所有值,无论密钥是否重复。

1 个答案:

答案 0 :(得分:0)

您的解决方案似乎存在缺陷;你不需要多地图。 试试这个:

  1. 创建一个Map()(其中某些内容为Double,Float或者您使用的是总和)。
  2. 在一行中读取(例如1.36 = 65.0)。
  3. 将其解析为键和值(例如键:1.36,值:65.0)
  4. 从地图中检索密钥的当前值。
  5. 如果为null,只需将值放入地图中。
  6. 如果不为null,则将当前值添加到新值(您刚刚读入的值)并将总和存储在地图中。
  7. 重复直到不再输入。
  8. 编辑

    1. 不要将金额存储为字符串;将它存储为地图中的双倍。
    2. 你可能不需要半径上的parsedouble;只需将b [0]中的值存储为半径。例如,stringRad = b[0];
    3. 使用相同的基本类型存储和检索。您正在使用String(stringRad)并使用double(radius)。
    4. System.out.println("new if; "+val);永远不会在if val == null块中有价值。请尝试使用+ stringRad+ stringNum代替+val