Java如何从含整数与字符串的文本文件中读取整数并求和
解决混合内容文件中读取整数并计算质数平均值的问题
我明白你的需求啦——要从既有整数又有字符串的文件里只提取整数,还得计算其中质数的平均值,而且只能用while (!scan.hasNextInt())这个方法来跳过非整数内容。咱们先看看你原代码里的问题,再一步步修正。
原代码的几个问题
- 处理非整数时用
file.nextLine()不合适:你的文件内容是空格分隔的单个token(比如1、2、John),nextLine()会直接读取一整行,可能跳过了后面的整数,应该用file.next()来跳过单个非整数token。 - 循环逻辑混乱:质数判断的代码块没有完全包裹在读取整数的逻辑里,可能会导致未初始化的变量问题。
- 错误的空文件提示:不管文件有没有有效内容,最后都会输出“File is Empty”,这显然不对。
修正后的代码
import java.util.Scanner; import java.io.File; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { int number; int temp; boolean isPrime = true; double count = 0.0; double total = 0.0; File inputFile = new File("Values.txt"); Scanner file = new Scanner(inputFile); while (file.hasNext()) { // 用while循环跳过所有非整数的token,直到找到下一个整数 while (!file.hasNextInt()) { file.next(); // 跳过当前非整数的单个token } // 现在可以读取整数了 number = file.nextInt(); // 判断当前数是否为质数 isPrime = true; if (number <= 1) { isPrime = false; // 1及以下的数不是质数 } else { for (int i = 2; i <= Math.sqrt(number); i++) { // 优化:循环到平方根即可,比number/2效率高 temp = number % i; if (temp == 0) { isPrime = false; break; } } } // 如果是质数,累加总和和计数 if (isPrime) { total += number; count++; } } // 根据情况输出结果 if (count == 0) { System.out.println("没有找到质数,或者文件中没有有效整数"); } else { System.out.println("质数的平均值为:" + (total / count)); } file.close(); } }
关键逻辑解释
- 跳过非整数:用嵌套的
while (!file.hasNextInt())循环,只要下一个token不是整数,就用file.next()跳过它,直到找到下一个整数为止,完美符合你要求的方法。 - 质数判断优化:把循环条件改成
i <= Math.sqrt(number),比number/2效率更高,因为如果一个数有因数,那肯定有一个因数小于等于它的平方根。 - 边界处理:增加了对
number <=1的判断,因为1和负数都不是质数,避免错误计算。 - 正确的输出逻辑:只有当没有找到任何质数时,才提示相关信息,否则输出平均值,不会再错误输出“File is Empty”。
用这个代码处理你给出的文件内容1 2 John 3 4 Black 5 Jason 7 8,会提取出整数2、3、5、7,它们的平均值是(2+3+5+7)/4 = 17/4 = 4.25,运行后会正确输出这个结果。
内容的提问来源于stack exchange,提问作者TheAverageJoe




