You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java如何从含整数与字符串的文本文件中读取整数并求和

解决混合内容文件中读取整数并计算质数平均值的问题

我明白你的需求啦——要从既有整数又有字符串的文件里只提取整数,还得计算其中质数的平均值,而且只能用while (!scan.hasNextInt())这个方法来跳过非整数内容。咱们先看看你原代码里的问题,再一步步修正。

原代码的几个问题

  • 处理非整数时用file.nextLine()不合适:你的文件内容是空格分隔的单个token(比如12John),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();
    }
}

关键逻辑解释

  1. 跳过非整数:用嵌套的while (!file.hasNextInt())循环,只要下一个token不是整数,就用file.next()跳过它,直到找到下一个整数为止,完美符合你要求的方法。
  2. 质数判断优化:把循环条件改成i <= Math.sqrt(number),比number/2效率更高,因为如果一个数有因数,那肯定有一个因数小于等于它的平方根。
  3. 边界处理:增加了对number <=1的判断,因为1和负数都不是质数,避免错误计算。
  4. 正确的输出逻辑:只有当没有找到任何质数时,才提示相关信息,否则输出平均值,不会再错误输出“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

火山引擎 最新活动