0

这是我的代码

void reduce() {
    KeyVal reducer1 = new KeyVal();
    for (int i=0; i< m1.size(); i++) {
        reducer1.setKey(m1.get(i).getKey());
        reducer1.setValue(m1.get(i).getValue());

        for (int j=i+1; j < m1.size(); j++) {
              if (m1.get(i).getKey().compareTo(m1.get(j).getKey()) == 0) {
                  m1.remove(j);
                  //System.out.println(i + "-->" + j);
                  reducer1.setValue(reducer1.getValue() + 1);
              }
          }         

        System.out.println(reducer1.getKey());
        System.out.println(reducer1.getValue());
        //r1.add(reducer1);
      }

基本上是用来数数的。特定条目的出现次数。如果我提供输入

3494702579
3494702579
3494702579

我正进入(状态

3494702579
2
3494702579
1

但我应该得到

3494702579
3

我究竟做错了什么?

4

2 回答 2

2

m1您在对其进行迭代时从中删除元素。这会导致内部循环跳过一些元素。发生这种情况是因为,在您删除j-th 元素后,您仍在递增j.

在您的示例中,其中一个3494702579被跳过,并被外循环的第二次迭代拾取。

您的方法的整个逻辑可以使用一个Map计数键和一次遍历输入列表来重写。

于 2013-03-23T07:39:35.010 回答
2

在您的内部循环中,当您删除一个元素然后增加j您实际上可能会跳过一个元素。

但一般来说,做你想做的更好的方法是使用多集的 HashMap 实现。您当前的解决方案是O(n^2),而 HashMap 非常接近O(N)

void reduce() {
    HashMap<xxx, Integer> reducer1 = new HashMap<xxx, Integer>();
    for (int i=0; i< m1.size(); i++) {
        xxx key = m1.get(i).getKey();

        int count = 0;
        if ( reducer1.containsKey(key) ) count = reducer1.get(key);

        reducer1.put(key, count+1);  
     }
     //print the values
}
于 2013-03-23T07:42:28.507 回答