2

私のプログラムはテキスト ファイルを取り込んで、すべての固有の単語 (または文字のグループ) をキーとしてマップに格納し、各単語が表示される行番号のリンク リストも格納します。また、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);
    }
}
4

1 に答える 1

1

したがって、単語ごとに保持したい

  • 出現回数
  • 表示される行番号の並べ替えられたセット (セットとは、重複する行番号がないことを意味します)

だからそれをしてください:

public class WordStats {
    private int occurrences;
    private SortedSet<Integer> lineNumbers = new TreeSet<Integer>();

    public void addOccurrence(int lineNumber) {
        occurrences++; 
        lineNumbers.add(lineNumber);
    }

    // getters ommitted for brevity
}

そして今、Map<String, WordStats>. テキスト内の単語ごとに、まだマップにない場合は WordStats を追加し、その WordStats インスタンスに出現を追加します。

printEntry メソッドは次のようになります。

public void printEntry(Map.Entry<String, WordStats> entry) {
    String word = entry.getKey();
    WordStats stats = entry.getValue();
    System.out.println("The word " + word + " has been met " 
                       + stats.getOccurrences() + " time(s), on the following line(s):");
    for (Integer lineNumber : stats.getLines()) {
        System.out.println(lineNumber);
    }
}
于 2013-03-16T22:49:46.263 に答える