我试图在Streams上做一些练习并遇到以下问题:
我有一个文本文件,我想计算每行的平均字数。有人可以告诉我,我的思维方式是否正确?这里有一些假代码,我认为应该在实施之后做到这一点:
double wordCount(String filepath){
return Files.lines(Paths.get(filepath))
// make a wordarray of the line
// average the size of every wordarray with something like that
(collect(Collectors.averagingDouble())
有人可以帮助我吗?
如何将一行转换为字符串数组?
如何获得该数组的大小?
答案 0 :(得分:4)
缺少的两个步骤是:
如何将一行转换为单词的Stringarray:split
>> spaces
如何获取该数组的大小:获取其s.split(" ");
>> length
在arr.length
IntStream
不太具体的double wordCount(String filepath) {
try {
return Files.lines(Paths.get(filepath))
.map(s -> s.split(" "))
.mapToInt(arr -> arr.length)
.average()
.orElse(-1.0);
} catch (IOException e) {
e.printStackTrace();
}
return -1.0;
}
操作(To avoid againt prop 1.)
Collectors
答案 1 :(得分:3)
你正在通过将一个字符串拆分成一串字符串来做不必要的工作,每个字一个字符串,用它们填充数组,然后只是为了询问数组的大小。
如果你想得到单词的数量,可以考虑一个简单的方法,只计算单词
private static final Pattern WORD = Pattern.compile("\\w+");
public static int wordCount(String s) {
int count = 0;
for(Matcher m = WORD.matcher(s); m.find(); ) count++;
return count;
}
然后,您可以在Stream操作中使用此方法来获取平均字数:
Files.lines(Paths.get(filePath)).mapToInt(YourClass::wordCount).average().orElse(0)
使用Java 9,您可以重写wordCount
方法以使用类似
private static final Pattern WORD = Pattern.compile("\\w+");
public static int wordCount(String s) {
return (int)WORD.matcher(s).results().count();
}
但是循环可能更有效,因为它省略了MatchResult
实例的构造。
答案 2 :(得分:1)
private static void wordcount(String filePath) throws IOException {
Path path = Paths.get(Paths.get(filePath).toUri());
double result = Files.lines(path).map(s -> {
String trimmed = s.trim();
if (trimmed.isEmpty()) return 0;
else return trimmed.split(" ").length;
}).mapToInt(i -> i.intValue()).average().getAsDouble();
System.out.println(result);
}
答案 3 :(得分:-1)
试试这个:
try(Stream<String> lines = Files.lines(Paths.get("src/test.txt"))){
OptionalDouble average =
lines.map(s -> s.split(" "))
.mapToInt(s -> s.length)
.average();
System.out.println(average.getAsDouble());
} catch (IOException e)
{
e.printStackTrace();
}