来自输入文本文件的 Min Max 和 Avg

Posted

技术标签:

【中文标题】来自输入文本文件的 Min Max 和 Avg【英文标题】:Min Max and Avg from an input text file 【发布时间】:2018-05-07 15:10:43 【问题描述】:

做这个家庭作业已经有一段时间了,但似乎无法完成 答案,对我的代码的一些反馈将不胜感激。 我有一个输入文本文件,其中包含以下内容

Min: 1,2,3,5,6
     Max: 1,2,3,5,6
Avg: 1,2,3,5,6
    P90: 1,2,3,4,5,6,7,8,9,10
Sum: 1,2,3,5,6
    P70: 1,2,3

我的任务是读取输入文本文件并创建一个输出文本文件 内容如下:

The min of [1,2,3,5,6] is 1.
    The max of [1,2,3,5,6] is 6.
The avg of [1,2,3,5,6] is 3.4.
    The 90th percentile of [1,2,3,4,5,6,7,8,9,10] is 9.
The sum of [1,2,3,5,6] is 17.
    The 70th percentile of [1,2,3] is 2.

到目前为止,我只是在尝试 min max 和 avg,我可以读取文件并且可以 输出我读入的内容。 我不知道如何找到 min max avg 等并输出这些值。似乎是 因为我的输入是一个字符串,我只需要读取 int 值。 这是我的代码

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

public class ExternalData 

public static void main(String[] args) 

    try 
        System.out.print("Enter the file name with extension : ");

        Scanner input = new Scanner(System.in);

        File file = new File(input.nextLine());

        input = new Scanner(file);

        while (input.hasNextLine()) 
            int min = input.nextInt();
            while(input.hasNextInt());
            int num = input.nextInt();
            if(num < min) 
                min = num;
            

            while (input.hasNextLine()) 
                int max = input.nextInt();
                while(input.hasNextInt());
                int num2 = input.nextInt();
                if(num2 > min) 
                    min = num;

            String avg = input.nextLine();




            Formatter f = new Formatter("C:\\Users\\Kevin\\Dropbox\\Kevin 
            Carter-8042\\Intro to Soft Eng\\Task 12\\outputTest.txt");

            // print the formatted strings to the file
            f.format("The min of [1,2,3,4,5,6] is " + min);

            f.format("\n\nThe max of [1,2,3,4,5,6] is " + max);

            f.format("\n\nThe avg of [1,2,3,4,5,6] is " + avg);
            f.close();    
                 

             catch (Exception ex) 
              ex.printStackTrace();
            

          

       

【问题讨论】:

如果输入恰好包含intwhile(input.hasNextInt()); 将永远循环。 根据token解析文件:minmax等,每一个都会触发一个方法(使用switch-case)。 除了不正确的代码,你在这里犯的另一个大错误是你在做假设。您假设您的代码包含:The avg of [1,2,3,4,5,6],但是一旦我更改输入文件,您的代码就会打印出错误的东西。始终尝试编写足够通用的代码。 【参考方案1】:
package TrialPrograms;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class Test 

    public static void main(String[] args) throws IOException 



        FileInputStream fi = new FileInputStream("F:\\Test\\file.txt");
        FileOutputStream fo = new FileOutputStream("F:\\Test\\output.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fi));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fo));

        String strLine;
        while ((strLine = br.readLine()) != null)   

              String[] arr = strLine.split(" ");
              String[] nos = arr[1].split(",");

              Set<Integer> set = new HashSet<Integer>();  
              for(int i = 0; i<nos.length; i++)
                  int no = Integer.parseInt(nos[i]);
                       set.add(no); 
                    
              TreeSet<Integer> sortedSet = new TreeSet<Integer>(set); 

              switch(arr[0]) 

              case "Min:":
                  String msg1="The Min of [" +arr[1]+ "] is " +(Integer)sortedSet.first();
                  bw.write(msg1);
                  bw.newLine();

                  break;

              case "Max:":
                  String msg2="The Max of [" +arr[1]+ "] is " +(Integer)sortedSet.last();
                  bw.write(msg2);
                  bw.newLine();
                  break;

              case "Avg:":
                  Object[] noarray = sortedSet.toArray();
                  int noarraysize = noarray.length-1;
                  int sum=0;
                  for(int i=0;i<=noarraysize;i++) 

                      int no=Integer.valueOf(noarray[i].toString());
                      sum = sum + no;
                      if(i==noarraysize) 
                          String msg3="The Avg of [" +arr[1]+ "] is  " +(double)sum/noarray.length;
                          bw.write(msg3);
                          bw.newLine();
                                                  
                  
                  break;

              case "Sum:":
                  Object[] noarray1 = sortedSet.toArray();
                  int noarraysize1 = noarray1.length-1;
                  int sum1=0;
                  for(int i=0;i<=noarraysize1;i++) 
                      int no=Integer.valueOf(noarray1[i].toString());
                      sum1 = sum1 + no;
                      if(i==noarraysize1) 
                          String msg4="The Sum of [" +arr[1]+ "] is  " +sum1;
                          bw.write(msg4);
                          bw.newLine();
                                                  
                  
                  break;

            

    
        br.close();
        bw.close();

    

【讨论】:

您应该编辑您的问题并添加您的评论内容以完成您的回答 是的。编辑您的答案并添加您的内容。大多数好的答案都能解释提问者的逻辑或错误。这样,任何有类似问题的人都可以从您的回答和解释中获得更多关于该案例的知识。 是的。我按照你说的做了,但是我添加的 cmets 没有显示在这个页面的任何地方。 可能由于您是新用户,您的编辑正在审核中,稍后会显示。这很奇怪,因为您正在编辑自己的答案,但老实说,我对此不确定。

以上是关于来自输入文本文件的 Min Max 和 Avg的主要内容,如果未能解决你的问题,请参考以下文章

了解scikit CountVectorizer中的min_df和max_df

在 MySQL 中与 MAX、MIN 和 AVG 函数一起使用 MEDIAN

Hive分析窗口函数 SUM,AVG,MIN,MAX

如何计算 MySQL 表中所有行的 MIN、MAX、AVG

tf第十二讲:TextCNN做文本分类

PostgreSQL - 使用 AVG、MAX 和 MIN 进行标准化