带有列表的树/ Hashmap打印出来

时间:2013-03-16 22:25:41

标签: java list dictionary key

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

1 个答案:

答案 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);
    }
}