方法计算文件中的单词数
Method count words in a file
大家好,我正在编写一个计算文件中单词数的方法,但显然代码中某处存在错误,该方法不起作用。这是我的代码:
public class Main2 {
public static void main(String[] args) {
count("/home/bruno/Desktop/WAR_JEE_S_09_Podstawy/MojPlik");
}
static int count(String fileName){
Path path = Paths.get(fileName);
int ilosc = 0;
String wyjscie = "";
try {
for (String charakter : Files.readAllLines(path)){
wyjscie += charakter;
}
StringTokenizer token = new StringTokenizer(wyjscie," \n");
} catch (IOException e) {
e.printStackTrace();
}
return ilosc;
}
}
文件路径正确,这里是文件内容
test test
test
test
在我调用 main 中的方法后,它什么也不显示。哪里错了?
您的代码将在一个文件中计算 行 ……好吧,如果您跟进了那个想法。
现在您的代码只是简单地读取行,将它们放入一个大字符串中,然后不对该操作的结果做任何事情。你有一个单一的 int 计数器......谁被初始化为 0,然后就返回了,而不是 used/increased!除非我弄错了,否则 readAllLines()
最后会自动删除换行符,所以总的来说,你的代码没什么用。
要计算字数,您必须取每一行并且(例如)split 该单行字符串用于空格。这给你一个数字。然后将这些数字相加。
长话短说:真正的答案是你应该退后一步。不要只是编写代码,假设这会神奇地解决问题。相反:首先想出一个解决问题的策略(算法)。用纸笔写下算法思路。然后 "manually" 运行 一些样本数据上的算法。然后,最后,把算法变成代码。
另外,除了你没有输出任何东西,你的逻辑背后有一个小错误。我在这里和那里做了一些更改以使您的代码正常工作。
s.trim()
删除任何前导和尾部空格,trimmed.split("\s+")
在任何空白字符处拆分字符串,包括空格。
static int count(String fileName) throws IOException {
Path path = Paths.get(fileName);
int count = 0;
List<String> lines = Files.readAllLines(path);
for (String s : lines) {
String trimmed = s.trim();
count += trimmed.isEmpty() ? 0 : trimmed.split("\s+").length;
}
return count;
}
这里是Java8中使用函数式编程的代码。这也是使用Stream
的一个常见例子 flatMap
- 可用于计数或打印文件中的单词。
long n = Files.lines(Paths.get("test.txt"))
.flatMap(s -> Stream.of(s.split("\s+")))
.count();
System.out.println("No. of words: " + n);
注意 Files.lines(Path)
returns a Stream<String>
其中包含来自输入文件的行。此方法类似于 readAllLines
,但 returns 流而不是 List
。
大家好,我正在编写一个计算文件中单词数的方法,但显然代码中某处存在错误,该方法不起作用。这是我的代码:
public class Main2 {
public static void main(String[] args) {
count("/home/bruno/Desktop/WAR_JEE_S_09_Podstawy/MojPlik");
}
static int count(String fileName){
Path path = Paths.get(fileName);
int ilosc = 0;
String wyjscie = "";
try {
for (String charakter : Files.readAllLines(path)){
wyjscie += charakter;
}
StringTokenizer token = new StringTokenizer(wyjscie," \n");
} catch (IOException e) {
e.printStackTrace();
}
return ilosc;
}
}
文件路径正确,这里是文件内容
test test
test
test
在我调用 main 中的方法后,它什么也不显示。哪里错了?
您的代码将在一个文件中计算 行 ……好吧,如果您跟进了那个想法。
现在您的代码只是简单地读取行,将它们放入一个大字符串中,然后不对该操作的结果做任何事情。你有一个单一的 int 计数器......谁被初始化为 0,然后就返回了,而不是 used/increased!除非我弄错了,否则 readAllLines()
最后会自动删除换行符,所以总的来说,你的代码没什么用。
要计算字数,您必须取每一行并且(例如)split 该单行字符串用于空格。这给你一个数字。然后将这些数字相加。
长话短说:真正的答案是你应该退后一步。不要只是编写代码,假设这会神奇地解决问题。相反:首先想出一个解决问题的策略(算法)。用纸笔写下算法思路。然后 "manually" 运行 一些样本数据上的算法。然后,最后,把算法变成代码。
另外,除了你没有输出任何东西,你的逻辑背后有一个小错误。我在这里和那里做了一些更改以使您的代码正常工作。
s.trim()
删除任何前导和尾部空格,trimmed.split("\s+")
在任何空白字符处拆分字符串,包括空格。
static int count(String fileName) throws IOException {
Path path = Paths.get(fileName);
int count = 0;
List<String> lines = Files.readAllLines(path);
for (String s : lines) {
String trimmed = s.trim();
count += trimmed.isEmpty() ? 0 : trimmed.split("\s+").length;
}
return count;
}
这里是Java8中使用函数式编程的代码。这也是使用Stream
的一个常见例子 flatMap
- 可用于计数或打印文件中的单词。
long n = Files.lines(Paths.get("test.txt"))
.flatMap(s -> Stream.of(s.split("\s+")))
.count();
System.out.println("No. of words: " + n);
注意 Files.lines(Path)
returns a Stream<String>
其中包含来自输入文件的行。此方法类似于 readAllLines
,但 returns 流而不是 List
。