3

ArrayListから重複を削除するのに問題があります。それは大学への割り当てのためです。これが私がすでに持っているコードです:

public int numberOfDiffWords() {
    ArrayList<String> list = new ArrayList<>();
    for(int i=0; i<words.size()-1; i++) {
        for(int j=i+1; j<words.size(); j++) {
            if(words.get(i).equals(words.get(j))) {
                // do nothing
            }
            else  {
                list.add(words.get(i));
            }
        }
    }
    return list.size();
}

問題はnumberOfDiffWords()メソッドにあります。インストラクターから分析用のサンプル文字列(4465語を含む)が提供されたため、リストの入力方法は正しく機能しています。印刷words.size()すると正しい結果が得られます。

すべての重複を削除した新しいArrayListのサイズを返したい。

wordsArrayListクラスの属性です。

更新:割り当てのこの部分には、動的なインデックスベースのストレージのみを使用できます。つまり、ハッシュベースのストレージは使用できません。

4

5 に答える 5

5

これは課題なので、コードを書くつもりはありません。ただし、別のアプローチをお勧めします。

  • あなたがしているように配列を反復します
  • このメソッドを使用してsubList()、最初から現在の要素を含まないまでの配列のビューを作成します
  • contains()現在の要素が前のステップで作成されたサブリストにあるかどうかをテストするために使用します
  • プレフィックスに含まれていない要素がいくつ見つかったかを数えるだけです

私が推奨するアプローチは、はるかに単純で理解しやすいコードになるはずです。これはすべてO(n 2)ソリューションであることに注意してください(正しく理解する場合は、あなたのソリューションも同様です)。

配列の変更が割り当てで許可されている場合の別のアプローチは、配列を並べ替えることです。そうすると、等しい要素が隣接し、一意の要素の数を簡単に数えることができます。これはO(n log(n))アプローチです。(配列のコピーを作成することもできます。これにより、漸近的な複雑さは変わりませんが、ソリューションの速度が低下します。)

ある種のハッシュ関数(HashSetまたはHashMap)を使用しないと、それよりも良くなることはありません。

于 2012-12-02T16:53:13.077 に答える
2

その方法を使用する場合は、これが問題です。if-then-elseを変更して、2番目のループ内に単語が追加されないようにします。内側のループでブール変数を使用して重複があるかどうかを確認し、重複がない場合は、2番目のループの後に単語をリストに追加します。

于 2012-12-02T17:04:08.350 に答える
0

ループ全体を実行する代わりに、arraylistでcontains()メソッドを呼び出して重複をチェックする必要があります。

  word.subList(fromIndex, toIndex).contains(arg);

このようにして、コードは非常に簡潔になります。

于 2012-12-02T16:56:08.480 に答える
0

ネストされたforループ構造を使用して反復処理し、各要素の重複を削除してから、残りの要素を新しい配列に追加すると、より小さな配列を返すことができます。これが最速の方法かどうかはわかりませんが、機能します。

// Delete all dupes
for ( i=0; i<words.length; i++ ) {
  String word = words[i];
  for ( j=(i+1); j<words.length; j++) {
     if (words[j] == words[i]) {
        words[j] = null;
     }
  }
}

// Count the array w/o nulls
int countEl = 0;
for (i=0; i<words.length; i++) {
  if (words[i] != null) {
     countEl++;
  }
}

// Make a new array
String[] newArray = new String[countEl];

for (i=0; i<words.length; i++) {
  if (words[i] != null) {
    countEl.push(words[i]);
  }
}
于 2012-12-02T17:01:30.893 に答える
0

もっとシンプルにしたい場合は、これを試してください

final ArrayList duplicateWords = new ArrayList() ;
ArrayList<String> words = new ArrayList() {
    @Override
    public boolean add(Object e) {
        if( !contains(e) ) {
        return super.add(e);
        } else {
            duplicateWords.add(e);
            return false ;
        }
    }
};
System.out.println("Unique words : " + words.size());
System.out.println("Duplicate words : " + duplicateWords.size());

これは別の答えです。

于 2012-12-02T17:06:32.507 に答える