2

我的程序接收一个文本文件并将每个唯一的单词(或字符组)存储为映射中的键,并存储每个单词出现的行号的链接列表。我还在 printEntry 方法中实现了一个发生计数器。

我的问题是,如果一个单词在一行上出现多次,我会尽量避免打印相同的行号两次。我在 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();
}

编辑-

我希望所有条目的信息都显示在同一行,因为我们将要扫描大型(r)文档。我已将 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 回答