我必须编写一个简单的代码来对文本文件中的单词进行计数。然后有人告诉我,它是不完整的,因为例如,当连续有两个或多个空格时,函数会将它们视为一个单词,并且结果将是不正确的。因此,我尝试通过列出列表并删除其中的所有“”元素来修复它,但似乎不起作用。你能建议可以做什么吗?
这是现在的代码:
int count = 0;
File file = new File("C:\\Users\\user\\Desktop\\Test.txt");
FileInputStream fis = new FileInputStream(file);
byte[] bytesArray = new byte[(int) file.length()];
fis.read(bytesArray);
String s = new String(bytesArray);
String[] data = s.split(" ");
List<String> list = new ArrayList<>(Arrays.asList(data));
list.remove(" ");
data = list.toArray(new String[0]);
for (int i = 0; i < data.length; i++) {
count++;
}
System.out.println("Number of words in the file are " + count);
答案 0 :(得分:3)
您可以通过正则表达式来实现
int count = 0;
File file = new File("/home/vahid/Documents/test.txt");
FileInputStream fis = new FileInputStream(file);
byte[] bytesArray = new byte[(int) file.length()];
fis.read(bytesArray);
String s = new String(bytesArray);
String[] data = s.split("\\s+");
List<String> list = new ArrayList<>(Arrays.asList(data));
list.remove(" ");
data = list.toArray(new String[0]);
for (int i = 0; i < data.length; i++) {
count++;
}
System.out.println("Number of words in the file are " + count);
答案 1 :(得分:1)
成为一个书呆子。您可以使用java.nio.file
包中的类仅一行完成操作:)
int count = new String(Files.readAllBytes(Paths.get("/tmp/test.txt")), "UTF-8")
.trim().split("\\s+").length;
计算文件中有多少个单词。或者
String result = new String(Files.readAllBytes(Paths.get("/tmp/test.txt")), "UTF-8")
.trim().replaceAll("\\s+", " ");
使用单个字符串正确替换内容。
答案 2 :(得分:0)
尝试以下代码行:
String data1 = s.trim().replaceAll(" +", " ");
在行之前:
String[] data = data1.split(" ");
这应该删除String中2个或更多连续空格的任何出现。无需使用list.remove(" ")
答案 3 :(得分:0)
处理此类要求的最佳方法: 首先,我们应该知道文本文件中使用的字符编码。 基于这一点,我们应该尝试逐字节读取文件,并同时进行处理 例如:如果您在读取第一个字节时文件是utf-8,则当我们找到“。”时,我们可以识别要读取更多字节以获得第一个字符。或“”或换行符,那么我们可以将其识别为单词分隔符。
这种方式非常有效(特别是对于大文件),并且始终会影响文件编码。
如果我们用byte []调用String构造函数,它将始终使用默认编码,并且还会逐字节迭代数组。