簡體   English   中英

JAVA如何用txt文件中的數組替換scnr.next()以避免用戶鍵入數千次?

[英]JAVA how can I replace scnr.next() with the arrays in txt file to avoid user to type thousands of times?

我注意到用戶必須輸入很多變量才能完成此任務。 用戶需要根據此代碼鍵入90次。 我聽說我可以使用File,PrintWriter來允許Scanner以數組形式讀取txt內容。 我查閱了一堆教程,但是很難實現我的目標。 您介意我幫助我如何從txt文件將scnr.next()替換為數組嗎?

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

這就是我得到的。

  • 將您的Scanner替換為BufferedReader以讀取文件。
  • 循環遍歷文件中的所有行,並在循環時將它們附加到StringBuilder變量中。
  • 完成后,使用split方法獲取包含所有單詞的數組。
  • 現在,您可以循環獲得的數組。 數組中的第零個元素將是您的string1 ,第一個元素將是您的第一個三重嵌套的for循環中的string2 ,依此類推...
  • 請注意,單詞數為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM