1

String 型の要素が String 型の LinkedList に出現する回数をカウントできるメソッドを作成しています。以下に示す私のコードは機能しません。以下でコメントした行の範囲外のインデックスを取得し続けます。バグが見つからないようです

public int findDuplicate (LinkedList<String> e) {
int j = 1;
LinkedList<String> test = e;
while (!test.isEmpty()){
    test = e;
    String value = test.pop();
    //Screws up here when i = 6 
    for(int i =0; i<=test.size() && test.get(i)!=null; i++){ 
        String value3 = test.get(i);
        if(e.get(i).equals(value) && i<=test.size()){
            String value2 = test.get(i); 
            j++;
            String Duplicate = e.get(i);
            e.remove(i);
        }
    }
    System.out.println(value + " is listed " + j + " times");

}
return j;
}

ハッシュマップを使用しています..まだ機能しません

public void findDuplicate (LinkedList e) {

    Map<String,Integer> counts = new HashMap<String,Integer>();

    while(!e.isEmpty()){
        String value = e.pop();
        for(int i =0; i<e.size(); i++){
            counts.put(value, i);
        }
    }
    System.out.println(counts.toString());
}

私のコードは、リンクされたリストを調べて、リスト内の要素が何回出現し、同時にリストから重複を削除するかを調べる必要があります。次に、要素とリストに表示される回数を出力します。昨夜、この件について投稿しましたが、まだ返信がありません。再投稿すみません。

4

5 に答える 5

6

あなたはリストの終わりから離れています。変化する

for(int i =0; i<=test.size() && test.get(i)!=null; i++){ 

for(int i =0; i< test.size() && test.get(i)!=null; i++){ 

List(または配列)の有効なインデックスは0size() - 1です。

于 2013-03-04T21:41:22.830 に答える
2

マップを維持し、カウントを取得するための完璧なクラスを持つ google の guava コレクションをチェックしてください。

https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#BiMap

Multiset<String> wordsMultiset = HashMultiset.create();
wordsMultiset.addAll(words);
// now we can use wordsMultiset.count(String) to find the count of a word
于 2013-03-04T21:56:42.227 に答える
2

重複をカウントするハッシュマップの例について:

@Test
public void countOccurrences() {
    LinkedList<String> strings = new LinkedList<String>(){{
        add("Fred");
        add("Fred");
        add("Joe");
        add("Mary");
        add("Mary");
        add("Mary");
    }};

    Map<String,Integer> count = count(strings,new HashMap<String,Integer>());
    System.out.println("count = " + count);
}

private Map<String, Integer> count(List<String> strings, Map<String, Integer> runningCount) {
    if(strings.isEmpty()) {
        return runningCount;
    }
    String current = strings.get(0);
    int startingSize = strings.size();
    while(strings.contains(current)) {
        strings.remove(current);
    }
    runningCount.put(current, startingSize - strings.size());
    return count(strings,runningCount);
}

元の文字列リストを保持したい場合は、次のことができます

    Map<String,Integer> count = count(new LinkedList<String>(strings),new HashMap<String,Integer>());
    System.out.println("strings = " + strings);
    System.out.println("count = " + count);
于 2013-03-04T21:46:07.400 に答える
1

test = e声明が何をしているのか理解していただければ幸いです。このステートメントの後、両方を実行testし、同じオブジェクトをe参照します。

それらのいずれかがリストを変更すると、2 人とも同じオブジェクトを見ているため、他の人にもそれが表示されます。

これが意図されていない場合は、別のリスト参照に割り当てる前にリストを複製する必要があります。

于 2013-03-04T21:47:34.210 に答える
1

これは範囲外の問題には影響しませんが、評価中にリストから要素を削除しています。要素を削除する場合は、i--後で呼び出す必要があります。または、評価のために次のエンティティ (再インデックス化される) をスキップします。

また、コードに関しては、リストのコピーを作成しようとしていることがわかりますが、標準の割り当て手段teste両方が同じインスタンスを指しています。クラスの使用方法については、この SO スレッドをCollections.copy()参照してください。

于 2013-03-04T21:41:53.767 に答える