0

以下のコードは、ファイルからすべての単語を出力し(1番目の配列に配置)、その横にある1番目の単語(2番目の配列)を出力します。単語の重複がある場合は、配列内にあるその単語(最初の単語)を見つけて、数値配列に1を追加しますが、それでも配列内の重複を出力します。配列内に何回入っているかを示すために、その横に正しい番号が付いている単語の最初のインスタンスのみが必要です。私の問題は、重複を印刷したくないということです。(arraylists plzはありません)。

while ((in.hasNext())) {

    l = in.next() ;

    for(int i = 0; i< Wrd.length-1;i++){
        if (l.equals(Wrd[i])){
            num[i] = num[i] +1;
        } 

    }

    Wrd[n]=l;
    num[n] = num;

    n++;

}
4

3 に答える 3

1

Setまたはなどを使用できないようですMap-可能であれば、ここでの他の提案は、私が提案しようとしていることを実装するのがはるかに簡単です:-)

何らかの理由でできない場合は、これはどうですか?

// capture all the words first into an array
// the array below is for test purposes
String[] words = {"1", "2", "3", "5", "1", "1", "3", "4", "1", "5", "7", "0"};

Arrays.sort(words);  // sort the array - this is vital or the rest wont work
String last = words[0];
int count = 0;
for (String word : words) {
    if (word.equals(last)) {
        count++;
    } else {
        System.out.println(last + "=>" + count);

        count = 1;
        last = word;
    }
}
System.out.println(last + "=>" + count);

出力は次のようになります。

0=>1
1=>4
2=>1
3=>2
4=>1
5=>2
7=>1
于 2013-03-08T17:08:29.967 に答える
0

マップを使用する必要があります-これは、単語の一意のリストを維持するために自動的に処理されます。メソッドをオーバーライドして上書きするのputではなく集計すると、カウントが自動的に加算されます。

private void readWords(final Iterator<String> in) {
    final Map<String, Integer> wordMap = new HashMap<String, Integer>() {
        @Override
        public Integer put(String key, Integer value) {
            final Integer origValue = get(key);
            if (origValue == null) {
                return super.put(key, value);
            } else {
                return super.put(key, origValue + value);
            }
        }
    };
    while (in.hasNext()) {
        wordMap.put(in.next(), 1);

    }
    //just for display - not necessary
    for (final Entry<String, Integer> entry : wordMap.entrySet()) {
        System.out.println("Word '" + entry.getKey() + "' appears " + entry.getValue() + " times.");
    }
}

テスト:

List<String> strings = new LinkedList<String>();
strings.add("one");
strings.add("two");
strings.add("two");
strings.add("three");
strings.add("three");
strings.add("three");
readWords(strings.iterator());

出力:

Word 'two' appears 2 times.
Word 'one' appears 1 times.
Word 'three' appears 3 times.

TreeMapではなくを使用して単語をアルファベット順に並べ替えることができますHashMap。これは表示に適している場合があります。マップで何をする予定かによって異なります。

于 2013-03-08T16:47:16.360 に答える
0

ブールフラグを使用して、指定された単語が重複しているかどうかを追跡し、重複している場合は配列に追加しないでください。

while (in.hasNext()) {
    boolean dup = false;
    l = in.next() ;

    for(int i = 0; i< Wrd.length-1;i++){
        if (l.equals(Wrd[i])){
            num[i] = num[i] +1;
            dup = true;
            break; // No reason to check the rest of the array
        } 
    }

    if (!dup) {
        Wrd[n] = l;
        num[n] = num; // If you're looking for frequency, you probably want 1 not num

        n++; // only increment the index if we add a new word
    }
}
于 2013-03-08T16:47:30.587 に答える