首页 > 解决方案 > JAVA 如何用 txt 文件中的数组替换 scnr.next() 以避免用户输入数千次?

问题描述

我注意到用户必须输入很多变量才能完成此操作。用户需要根据此代码键入 90 次。听说可以使用 File、PrintWriter 让 Scanner 以数组形式读取 txt 内容。我查了一堆教程,但很难实现我的目标。你介意我帮我解决如何将我的 scnr.next() 替换为 txt 文件中的数组吗?

import java.util.Scanner; 

public class midtermBc3Choe{

   public static void main (String [] args){

    int workerNum = 30;
    int jobNum = 5;
    int monthNum = 6;

      System.out.println("There are 2 criteria to consider per job.");
      System.out.println("There are" + jobNum + "jobs for a person per month.");
      System.out.println("Tell a worker's quality of his job by useing word 'good' or 'bad.'");

      double correctEachTask[][][] = new double [workerNum][monthNum][jobNum];
      double correctMonthly[][] = new double [workerNum][monthNum];
      double correct6Month[] = new double [workerNum];

      Scanner scnr = new Scanner(System.in);

        for (int i = 0 ; i < workerNum ; i++){//workers
         for(int j=0; j< monthNum; j++){//month
            for(int k=0; k< jobNum; k++){//jobs
               boolean criteria1 = false;
               boolean criteria2 = false;
               String string1 = scnr.next();
               String string2 = scnr.next();

               if( string1.equals("good") && string2.equals("good") ){
                  criteria1= true;
                  criteria2 = true;
                  correctEachTask[i][j][k] = 1.0;
               }
               else if( string1.equals("good") && string2.equals("bad") ){
                  criteria1 = true;
                  criteria2 = false;
                  correctEachTask[i][j][k] = 0.5;
               }
               else if( string1.equals("bad") && string2.equals("good") ){
                  criteria1 = false;
                  criteria2 = true;
                  correctEachTask[i][j][k] = 0.5;
               }
               else{
                  correctEachTask[i][j][k] = 0.0;
               }
            }//end - task -each
         }// end j - month -each
      }//end k - workers - each


      for(int i= 0; i< workerNum; ++i){
         for(int j = 0; j < monthNum; ++j){
            double accum =0;
            for(int k =0; k < jobNum; ++k){
               accum += correctEachTask[i][j][k];
            }//for k - monthly avg correct
             correctMonthly[i][j]=accum/jobNum;
         }//for j- month - monthly avg correct
      }// for i - workerNum -monthly avg correct

      for(int i =0; i < workerNum; ++i){
            double accumMonthlyAvg =0;
         for(int j= 0; j < monthNum ; ++j){
            accumMonthlyAvg += correctMonthly[i][j];
         }// for j - month - 6 month avg correct
            correct6Month[i] = accumMonthlyAvg/monthNum;
      }// for i - workerNum - 6 month avg correct

      System.out.print("workers' monthly average: ");

      for (int i =0; i < workerNum; ++i){
         for(int j = 0; j < monthNum; ++j){
       System.out.print(correctMonthly[i][j]);  
         }    
      }//print out montly average

      System.out.println(" ");
      System.out.print("worker 6 month average: ");
      for (int i =0; i < workerNum; ++i){
          System.out.print(correct6Month[i]);
      }//print out 6 month average


   }//main

}//class

////////这是我的 input.txt 目前的样子

good good good good good
good good good good good
good bad good good bad
good good good good good
bad bad good good bad
bad bad good good bad
bad bad good good bad
bad bad good good bad
good good good good good
good good good good good
good bad good good bad
good good good good good
bad bad good good bad
bad bad good good bad
bad bad good good bad
bad bad good good bad
good good good good good
good good good good good
good bad good good bad
good good good good good
bad bad good good bad
bad bad good good bad
bad bad good good bad
bad bad good good bad
good good good good good
good good good good good
good bad good good bad
good good good good good
bad bad good good bad
bad bad good good bad

标签: javaarraysmethodsjava.util.scanner

解决方案


这是我得到的。.

  • 将您Scanner的替换为BufferedReader以读取文件。
  • 循环遍历文件中的所有行,并在循环时将它们附加到StringBuilder变量中。
  • 完成后,使用该split方法获取包含所有单词的数组。
  • 现在,您可以循环您获得的数组。数组中的第零个元素将是您string1的,第一个元素将string2在您的第一个三重嵌套 for 循环中,依此类推...
  • 请注意,单词数为 120。您的三重嵌套 for 循环将运行 (30*6*5) = 900 次。这会导致ArrayIndexOutOfBoundsException.
  • 此外,您的criteria1criteria2没有被使用。

这是代码:

public static void main(String[] args) {
    int workerNum = 30;
    int jobNum = 5;
    int monthNum = 6;

    System.out.println("There are 2 criteria to consider per job.");
    System.out.println("There are" + jobNum + "jobs for a person per month.");
    System.out.println("Tell a worker's quality of his job by useing word 'good' or 'bad.'");

    double correctEachTask[][][] = new double[workerNum][monthNum][jobNum];
    double correctMonthly[][] = new double[workerNum][monthNum];
    double correct6Month[] = new double[workerNum];

    BufferedReader br = null;//Use BufferedReader instead Scanner.
    String rawData = "";//This will store all the text read from the file.
    try {
        br = new BufferedReader(new FileReader("input.txt"));
        //Read the file until the end, then store the text read in rawData.
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
        while (line != null) {
            sb.append(line);
            sb.append(System.lineSeparator());
            line = br.readLine();
        }
        rawData = sb.toString();//here, convert the StringBuilder to normal String
        br.close();
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
    }

    //Now, we will split the long text whenever there is a space ie " ". We will obtain an array
    //that will have all the "words" that you are looking for.
    String[] cleanData = rawData.split(" ");
    //check everything is read correctly.
    for (int i = 0; i < cleanData.length - 1; i++) {
        System.out.println(cleanData[i]);
    }
    //Here, we will create a counter to loop through the array we obtained earlier.
    int counter = 0;
    for (int i = 0; i < workerNum; i++) {//workers
        for (int j = 0; j < monthNum; j++) {//month
            for (int k = 0; k < jobNum; k++) {//jobs
                boolean criteria1 = false;
                boolean criteria2 = false;
                //if reached the end of file
                //without this if statement, your program will crash.
                if (counter >= cleanData.length - 1) {
                    return;
                }
                //read the zeroth element
                String string1 = cleanData[counter];
                counter++;//increase the counter to read the first element
                String string2 = cleanData[counter];
                counter++;//increase the counter to read the second element once it loops back.
                if (string1.equals("good") && string2.equals("good")) {
                    criteria1 = true;
                    criteria2 = true;
                    correctEachTask[i][j][k] = 1.0;
                } else if (string1.equals("good") && string2.equals("bad")) {
                    criteria1 = true;
                    criteria2 = false;
                    correctEachTask[i][j][k] = 0.5;
                } else if (string1.equals("bad") && string2.equals("good")) {
                    criteria1 = false;
                    criteria2 = true;
                    correctEachTask[i][j][k] = 0.5;
                } else {
                    correctEachTask[i][j][k] = 0.0;
                }
            }//end - task -each
        }// end j - month -each
    }//end k - workers - each

    for (int i = 0; i < workerNum; ++i) {
        for (int j = 0; j < monthNum; ++j) {
            double accum = 0;
            for (int k = 0; k < jobNum; ++k) {
                accum += correctEachTask[i][j][k];
            }//for k - monthly avg correct
            correctMonthly[i][j] = accum / jobNum;
        }//for j- month - monthly avg correct
    }// for i - workerNum -monthly avg correct

    for (int i = 0; i < workerNum; ++i) {
        double accumMonthlyAvg = 0;
        for (int j = 0; j < monthNum; ++j) {
            accumMonthlyAvg += correctMonthly[i][j];
        }// for j - month - 6 month avg correct
        correct6Month[i] = accumMonthlyAvg / monthNum;
    }// for i - workerNum - 6 month avg correct

    System.out.print("workers' monthly average: ");

    for (int i = 0; i < workerNum; ++i) {
        for (int j = 0; j < monthNum; ++j) {
            System.out.print(correctMonthly[i][j]);
        }
    }//print out montly average

    System.out.println(" ");
    System.out.print("worker 6 month average: ");
    for (int i = 0; i < workerNum; ++i) {
        System.out.print(correct6Month[i]);
    }//print out 6 month average

}//main

推荐阅读