从数据文件中的一行整数中查找最大值和最小值

Posted

技术标签:

【中文标题】从数据文件中的一行整数中查找最大值和最小值【英文标题】:finding max and min from a line of integers in a data file 【发布时间】:2020-08-24 14:47:25 【问题描述】:

我正在尝试从数据文件中查找一行文本的最大值和最小值。虽然这个数据文件中有很多行文本。

数据

-99 1 2 3 4 5 6 7 8 9 10 12345
10 9 8 7 6 5 4 3 2 1 -99
10 20 30 40 50 -11818 40 30 20 10
32767
255 255
9 10 -88 100 -555 1000
10 10 10 11 456
-111 1 2 3 9 11 20 30
9 8 7 6 5 4 3 2 0 -2 -989
12 15 18 21 23 1000
250 19 17 15 13 11 10 9 6 3 2 1 -455
9 10 -8 10000 -5000 1000

我尝试将这些行变成数组,这让我有所收获。

这是我的代码

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

// It is called "Average". Don't mind that.
public class Average 

    public static void main(String[] args) throws IOException
    
        Scanner file = new Scanner(new File("average.dat"));


        String[] array = null;

        while(file.hasNextLine())
        
        //Storing the ints from the data file into an array.
        String line = file.nextLine();
        String[] str = line.split("\\s+");
        array = new String[str.length];
        for (int i = 0; i < str.length; i++)
            array[i] = (str[i]);
        
        System.out.println("Max:" + Average.getMax(array));
        System.out.println("Min:" + Average.getMin(array));
        System.out.println();
        

    
    //Simple way of getting max value. Nabbed it off google.
    public static String getMax(String[] inputArray)
     
        String maxValue = inputArray[0]; 
        for(int i=1;i < inputArray.length;i++) 
          if(inputArray[i].compareTo(maxValue)>0) 
             maxValue = inputArray[i]; 
           
         
        return maxValue; 
     
    //Simple way of getting min value. Took off google as well.
    public static String getMin(String[] inputArray) 
        String minValue = inputArray[0]; 
        for(int i=1;i<inputArray.length;i++) 
          if(inputArray[i].compareTo(minValue)<0) 
            minValue = inputArray[i]; 
           
         
        return minValue; 
       

这是我的输出

Max:9
Min:-99

Max:9
Min:-99

Max:50
Min:-11818

Max:32767
Min:32767

Max:255
Min:255

Max:9
Min:-555

Max:456
Min:10

Max:9
Min:-111

Max:9
Min:-2

Max:23
Min:1000

Max:9
Min:-455

Max:9
Min:-5000

如您所见,最小值是正确的。虽然,最大值不是?它无缘无故地给了我9,我不知道为什么。您可能会问“为什么不将数组设为 int[] 而不是 String[]?”我不知道如何将数据文件中的整数复制到整数数组中。我只知道如何使用 String 数组来做到这一点。有谁知道这样做的正确方法吗?

【问题讨论】:

您正在进行字符串比较。进行字符串比较时,“9”大于“3456”。 “-9”将小于“-1234”。使用 Integer.parseInt(String s) 将字符串转换为 int,然后就可以进行整数比较了。 【参考方案1】:

带有 cmets 和解释的紧凑解决方案:

public static void main(String[] args) 

    // Create an input stream
    try (Stream<String> stream = Files.lines(Paths.get("average.dat"))) 

        // Get each line from the stream
        stream.forEach(line -> 

            // Cut the line into peaces
            String[] numbers = line.split(" ");

            // Create a list of integers from the pieces
            List<Integer> integers = Arrays.stream(numbers).map(Integer::parseInt).collect(Collectors.toList());

            // Calculate max
            System.out.println("Max:" + integers.stream().flatMapToInt(IntStream::of).max().orElseThrow());

            // Calculate min
            System.out.println("Min:" + integers.stream().flatMapToInt(IntStream::of).min().orElseThrow());

            // Ouput a new line
            System.out.println();
        );
     catch (IOException e) 
        e.printStackTrace();
    

【讨论】:

【参考方案2】:

实际上,您不需要分别计算最大值和最小值。考虑以下几点:

将最大值和最小值设置为第一个值。 检查该值是否为max,如果是,请将其分配给max。 否则,只需与 min 进行比较并根据需要进行分配。
while (file.hasNextLine()) 
    // Storing the ints from the data file into an array.
    String[] str = file.nextLine().split("\\s+");
    int max = Integer.parseInt(str[0]);
    int min = max;
    for (int i = 1; i < str.length; i++) 
        int v = Integer.parseInt(str[i]);
        if (v > max) 
            max = v;
         else if (v < min) 
            min = v;
        
    
    System.out.println("Max:" + max);
    System.out.println("Min:" + min);
    System.out.println();

【讨论】:

【参考方案3】:

您可以使用 int 进行比较

    public static String getMax(String[] inputArray)  
        int maxValue = Integer.MIN_VALUE;
        for(int i = 0; i < inputArray.length; i++)  
          if(maxValue < Integer.parseInt(inputArray[i])) 
             maxValue = Integer.parseInt(inputArray[i]); 
           
         
        return String.valueOf(maxValue); 
     

    public static String getMin(String[] inputArray)  
        int minValue = Integer.MAX_VALUE;
        for(int i = 0; i < inputArray.length; i++)  
          if(minValue > Integer.parseInt(inputArray[i])) 
             minValue = Integer.parseInt(inputArray[i]); 
           
         
        return String.valueOf(minValue); 
     

【讨论】:

【参考方案4】:

你应该使用:Integer.pharseToInt() 然后当你有一个整数数组并且你可以很容易地找到最大值时:

int getMax(int [] array)
    int max = INTEGER.MIN_VALUE;
    for (int i=0: i<array.length; i++)
        if (array[i]>max)
            max = array[i];
return max;

求最小值的完全对称函数。

【讨论】:

以上是关于从数据文件中的一行整数中查找最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何在文件处理中从文本文件中找到每一行的最小值和最大值?

在包含整数和字符串的混合数据框中查找最小/最大值

如何从从excel文件派生的大量字典中的值列表中查找最小值和最大值

如何只进行“n”比较,从文本文件中查找最小值和最大值?

如何查找excel一行中最小值

从具有多列的 .txt 文件中查找最大值、最小值