我有一个文本文档,如下所示:
2 2 1 4 2 8
2 4 1 4 2 8
2 6 1 4 2 8
我想找到第二列(2,4,6)中所有数字的平均值。我写了一个我认为应该这样做的循环。 totalVal是加在一起的所有数字的总值,而totalNum是数字的总数。
String line = data.nextLine();// read one line into a String
while (data.hasNextLine()) {
String[] field = line.split(" ");
totalVal += Double.parseDouble(field[1]);
totalNums += 1;
line = data.nextLine();
}
System.out.println(totalVal / totalNums);
问题是,我得到的答案返回值3,这意味着它只取文档中前两行文本的平均值,并省略第三行。
有人可以告诉我如何更改循环以便在第三行文本中添加值吗?
答案 0 :(得分:7)
目前尚不清楚为什么在循环之前读取一行。
如果您读取一行作为循环的第一步,那么所有行都将被正确处理。
while (data.hasNextLine()) {
String line = data.nextLine();
String[] field = line.split(" ");
totalVal += Double.parseDouble(field[1]);
totalNums += 1;
}
答案 1 :(得分:6)
当您在最后一行之前时,使用line = data.nextLine();
检索最后一行,然后立即检查data.hasNextLine()
循环中是否while
。由于您到达了最后一行,因此返回false
并退出循环。
将您的代码更改为:
while (data.hasNextLine()) {
String line = data.nextLine();
String[] field = line.split(" ");
totalVal += Double.parseDouble(field[1]);
totalNums += 1;
}
首先检查是否有下一行然后获取它。
现在,超级Java 8单行为此:
double average = Files.lines(Paths.get(file))
.mapToDouble(l -> Double.parseDouble(l.split(" ")[1]))
.average().orElse(0);
答案 2 :(得分:2)
相信JVM:读完第三行后,没有下一行。它因为你告诉它而停止。
试试这样:
package cruft;
import java.util.Scanner;
/**
* LoopDemo made to work
* @author Michael
* @link https://stackoverflow.com/questions/32810613/while-loop-in-java-wont-perform-action-on-last-line-of-document/32810646?noredirect=1#comment53458064_32810646
* @since 9/27/2015 1:27 PM
*/
public class LoopDemo {
public static void main(String[] args) {
try {
Scanner data = new Scanner(LoopDemo.class.getResourceAsStream("/LoopDemo.dat"));
double totalVal = 0.0;
int totalNums = 0;
String line;
while (data.hasNextLine()) {
line = data.nextLine();
String[] field = line.split("\\s+");
totalVal += Double.parseDouble(field[1]);
totalNums += 1;
}
System.out.println(totalVal / totalNums);
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 3 :(得分:2)
如果你在结尾打印出line
,你会发现最后一行就在那里。您捕获了最后一行,清空了文件,然后检查了清空后是否还有其他文件。你应该这样做
while(data.hasNextLine())
{
line = nextLine();
// ...stuff...
}
并删除循环外的line = nextLine()
或将其转换为do-while循环。
答案 4 :(得分:0)
您可以使用BufferedReader(br)读取文档的所有行,如下所示:
while ((line = br.readLine()) != null) {
doSomethingWith(line);
}