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- 番目の要素を削除した後も、まだインクリメントしているために発生しますj

あなたの例では、そのうちの 1 つ3494702579がスキップされ、外側のループの 2 番目の反復によって選択されます。

メソッドのロジック全体はMap、キーからカウント、および入力リストに対する 1 つのパスを使用して書き直すことができます。

于 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 に答える