我写了一个方法,它必须找到所有单词的行号,然后打印出来 输入必须遵循
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]
我该如何解决这个问题呢? 感谢所有读者。
答案 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<>();