0

我是 java 新手,感谢这个站点,我知道如何从列表中获取最低值,但我仍在努力解决如何让相同的代码为最高值工作。在过去的 2 个小时里,我一直在努力。再次感谢任何帮助

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class LargenSmall {
    public static void main(String[] args) throws IOException {
        String filename;        //Numbers file
        double lowest = Double.POSITIVE_INFINITY;//lowest number in list
        double highest; //highest number in list

        //Open the file
        File file = new File("Numbers.txt");
        Scanner inputFile = new Scanner(file);

        //Set lowest to zero


        //Read all the values in Numbers file and find the lowest value
        while (inputFile.hasNext()) {
            //Read the numbers in the file and compare each value to find lowest value
            double number = inputFile.nextDouble();
            if (number < lowest) lowest = number;
        }

        //Set highest to zero
        highest = 0.0;

        //Read all the values in Numbers file and find the highest value
        while (inputFile.hasNext()) {
            //Read the numbers in the file and compare each value to find highest value
            double number = inputFile.nextDouble();
            if (number > highest) highest = number;
        }

        //Close file
        inputFile.close();

        //Print out the lowest value in the list
        System.out.println("The lowest number in your file called, " +
                "Numbers.txt is " + lowest + ".");

        //Print out the highest value in the list
        System.out.println("The highest value in the list is " + highest);
    }
}

我已经尝试了一些变化,最高值一直返回为 0.0

4

3 回答 3

0

在学习语言时(以及在学习之后),有一小部分代码很有帮助,易于编写、测试和维护。例如,比较一个数字并记住可以转移到另一个班级并进行测试。

我不打算纠正你的编程错误。我想记录一下编写更好代码的良好编程实践。

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class LargenSmall {
    BigHolder bigHolder= new BigHolder();
    SmallHolder smallHolder = new SmallHolder();

    public static void main(String[] args) throws IOException {
        new LargenSmall().doSearch(args[0]);

    }
     void doSearch (String filename) throws IOException {
        //Open the file
        File file = new File(filename);
        Scanner inputFile = new Scanner(file);
        iterateAndFetchNumbers(inputFile);
        inputFile.close();
        printResult();

         testNumbers();
     }

    private void iterateAndFetchNumbers(Scanner inputFile) {
        //Read all the values in Numbers file and find the highest value
        while (inputFile.hasNext()) {
            //Read the numbers in the file and compare each value to find highest value
            double number = inputFile.nextDouble();
            smallHolder.accept(number);
            bigHolder.accept(number);
        }
    }

    private void printResult() {
        //Print out the lowest value in the list
        System.out.println("The lowest number in your file called, " +
                "Numbers.txt is " + smallHolder.small + ".");

        //Print out the highest value in the list
        System.out.println("The highest value in the list is " + bigHolder.big);
    }
    //
    private static class SmallHolder {
        double small= Double.POSITIVE_INFINITY;
        public void accept(double newNumber) {
            if ( newNumber < small) {
                small = newNumber ;
            }
        }

    }

    private static class BigHolder {
        double big= 0;
        public void accept(double newNumber) {
            if ( newNumber > big ) {
                big = newNumber ;
            }
        }
    }

    //self test example - should be in junit class
    public void testNumbers() {
        BigHolder b = new BigHolder();

        b.accept(1);
        b.accept(3);
        b.accept(8);
        b.accept(0);
        b.accept(100);
        assert b.big == 0;//junit assert really
    }


}
于 2013-03-04T05:17:18.447 回答
0

首先,您应该在循环之前声明变量以提高速度:

double number;
while (inputFile.hasNext())
{
number = inputFile.nextDouble();
if (number > highest) highest = number;
}

其次,您似乎没有在开始查找最大值之前从文件的开头开始读取,因此,该块可能没有被执行(因为您已经到达文件的末尾):

while (inputFile.hasNext())
{
double number = inputFile.nextDouble();
if (number > highest) highest = number;
}
于 2013-03-04T02:52:22.630 回答
0

你几乎在那里。您不需要两个 While 循环。第二个 While 循环不适用于您的情况。您可以在第一个 while 循环中包含条件,如下所示。

    double lowest = Double.POSITIVE_INFINITY;
    double highest = 0d;
    // Read all the values in Numbers file and find the lowest value
    while (inputFile.hasNext()) {
        // Read the numbers in the file and compare each value to find
        // lowest value
        double number = inputFile.nextDouble();
        if (number < lowest)
            lowest = number;
        else if (number > highest)
            highest = number;
    }
于 2013-03-04T02:59:06.347 回答