我的程序接收一个文本文件并将每个唯一的单词(或字符组)存储为地图中的键,并存储每个单词出现的行号的链接列表。我还在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);
}
}
答案 0 :(得分: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,并向其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);
}
}