从文本中找出单词的所有行号

时间:2015-12-26 21:57:32

标签: java hashmap

我写了一个方法,它必须找到所有单词的行号,然后打印出来 输入必须遵循

 Word:works/*(just one in file)*/Line Number:[7]  
 Word:run                      Line Number:[3,7,9]
 Word:we                       Line Number[5,8]   

这就是我的方法

HashMap m2 = new HashMap();

public void addLine(FileReader file) throws IOException {
        try {
            LineNumberReader lnR = new LineNumberReader(file);
            StringBuilder sb = new StringBuilder();
            String line = lnR.readLine();

            while (line != null) {
                String[] words = line.split("\\W+");
                for (int i = 0; i < words.length; i++) {
                    if (m2.get(words[i].toLowerCase()) == null) {
                        m2.put(words[i].toLowerCase(), "[" + lnR.getLineNumber() + " ");
                    } else {
                        int x = lnR.getLineNumber();
                        m2.put(words[i].toLowerCase(), " " + x + "]");
                    }
                }
                sb.append(System.lineSeparator());
                line = lnR.readLine();
            }
            lnR.close();
        } catch (IOException ex) {
            System.out.println("Error reading file '" + file + "'");
        }
    }

我的主要方法。

public static void main(String[] args) throws IOException {
addLine(new FileReader("C:/Users/Text.txt"));
Map<String, String> sorted1 = new TreeMap<String, String>(m2);
        for (Object key : sorted1.keySet()) {
            System.out.println("Word: " + key + "\tLine Number: " m2.get(key));
        }
}

我的方法给了我错误的输出。

Word: write     Line Number:  [9
Word: we    Line Number:  8]

我该如何解决这个问题呢? 感谢所有读者。

2 个答案:

答案 0 :(得分:2)

试试这个。

static Map<String, List<Integer>> addLine(Reader reader) {
    LineNumberReader r = new LineNumberReader(reader);
    return r.lines()
        .filter(line -> line.length() != 0)
        .flatMap(line -> Arrays.stream(line.split("\\W+")))
        .map(word -> word.toLowerCase())
        .collect(Collectors.groupingBy(word -> word,
            TreeMap::new,
            Collectors.mapping(word -> r.getLineNumber(), Collectors.toList())));
}

public static void main(String[] args) throws IOException {
    try (Reader reader = new FileReader("C:/Users/Text.txt")) {
        for (Entry<String, List<Integer>> e : addLine(reader).entrySet())
            System.out.println("Word: " + e.getKey() + "\tLine Number: " + e.getValue());
    }
}

答案 1 :(得分:1)

您需要进行一些小改动:

(非强制性:保存较低的单词,而不是四次。)

final String lowerCaseWord = words[i].toLowerCase();

如果单词不在HashMap中,请添加方括号和行号。

if (m2.get(lowerCaseWord) == null) {
    m2.put(lowerCaseWord, "[" + lnR.getLineNumber());
} [...]

如果单词在HashMap中,获取存储的值并附加新的行号。

[...] else {
    int x = lnR.getLineNumber();
    m2.put(lowerCaseWord, m2.get(lowerCaseWord) + "," + x);
}

添加所有结束方括号。

for (String key : m2.keySet()) {
    m2.put(key, m2.get(key) + ']');
}

编辑:

为此,您需要将m2声明为:

static Map<String, String> m2 = new HashMap<>();