私のプログラムはテキスト ファイルを取り込んで、すべての固有の単語 (または文字のグループ) をキーとしてマップに格納し、各単語が表示される行番号のリンク リストも格納します。また、printEntry メソッドにオカレンス カウンターを実装しました。
私の問題は、1 つの単語が 1 行に 2 回以上表示される場合に、同じ行番号を 2 回出力しないようにしようとしていることです。私は printEntry メソッドの if ステートメントをいじり、近づいているように見えますが、まだ葉巻はありません。重複した行番号がリストに追加されるのをブロックしたくありません。発生変数をインクリメントするためにカウントする必要があるからです。
これは私に問題を引き起こす入力です:
keyboard
mouse mouse
mouse
次のような出力が必要です。
ID: keyboard Line Numbers: 1 Occurance: 1
ID: mouse Line Numbers: 2,3 Occurance 3
記事を短くするために、ここでは printEntry メソッドのみを提供します。必要に応じて、さらにコードを提供できます。ありがとう。
public static void printEntry(Map.Entry entry){
//local occurance variable
int occurance = 1;
//print the word and the line numbers as well as test for duplicate line integers on the same key
Iterator itr = ((LinkedList) entry.getValue()).iterator();
System.out.print("ID: " + entry.getKey() + " Lines: " + itr.next());
//object variable to store previous line number
Object check = itr.next();
while(itr.hasNext()){
occurance++;
if (check != itr.next()){
System.out.print(", " + itr.next());
}
else {
System.out.println("Skipped duplicate");
}
}
//prints occurance from incremented occurance variable
System.out.print(" " + " Occurance: " + occurance);
System.out.println();
}
編集-
大きなドキュメントをスキャンするので、エントリのすべての情報を同じ行に表示したいと思います。printEntry メソッドを必要な場所に近づけてフォーマットしましたが、for ループでそれを行う方法がわかりません。
public void printEntry(Map.Entry<String, WordStats> entry) {
String word = entry.getKey();
WordStats stats = entry.getValue();
System.out.print("ID: " + word + " Occurrences: "
+ stats.getOccurrences() + " Lines: ");
for (Integer lineNumber : stats.getLines()) {
System.out.println(lineNumber);
}
}