5 回答
TA贡献1810条经验 获得超4个赞
或者(Java 8 +),你可以用 和 方法非常轻松地做到这一点:lines()chars()
BufferedReader br = new BufferedReader(fr);
long count = br.lines().flatMapToInt(e -> e.codePoints()).filter(e -> !Character.isWhiteSpace(e)).count();
这将占用文件的行,将它们平面映射到字符,过滤掉任何空格,然后计算元素Stream<String>String::codePoints
TA贡献1820条经验 获得超10个赞
为什么不在从所有空格中清除每行后添加每行的字符数:
while (line != null) {
count += line.replaceAll("\\s+", "").length();
line = br.readLine();
}
TA贡献1852条经验 获得超1个赞
也许我错过了一些东西,但我不明白分裂有什么好处。我会这样做:
public static void main(String[] args) {
try {
FileReader fr = new FileReader("/tmp/test.txt");
BufferedReader br = new BufferedReader(fr);
int count = 0;
String line;
line = br.readLine();
while (line != null) {
for (int i = 0; i < line.length(); i++)
if (!Character.isWhitespace(line.charAt(i)))
count++;
line = br.readLine();
}
br.close();
System.out.println(count);
} catch (IOException ex) {
System.out.println(ex);
}
}
具体来说,我认为根本不需要修改输入,通过调用split,制作额外的副本,执行查找/替换等。这一切都需要额外的时间和空间。
实际上,我看不出有任何理由打扰按行处理文件:
public static void main(String[] args) {
try {
FileReader fr = new FileReader("/tmp/test.txt");
BufferedReader br = new BufferedReader(fr);
int count = 0;
while (true) {
int c = br.read();
if (c < 0)
break;
if (!Character.isWhitespace(c))
count++;
}
br.close();
System.out.println(count);
} catch (IOException ex) {
System.out.println(ex);
}
}
使用缓冲读取器本身可以让您有效地不逐个字符读取文件。因此,通过这种方式可以保存每行的额外副本。
TA贡献1793条经验 获得超6个赞
字符类具有“是白色空间()”方法
java.lang.Character.isWhitespace(字符 ch)
while (line != null)
{
for (int i = 0; i < line.length(); i++)
{
if (!Character.isWhitespace(line.charAt(i)))
count ++;
line = br.readLine();
}
System.out.println(count);
}
TA贡献1757条经验 获得超8个赞
为什么不在执行拆分和计数之前从字符串中删除空格?
一种方法是使用正则表达式:
while (line != null)
{
line.replaceAll("\\s+","");
lineCharacters = line.split("");
...
}
添加回答
举报