[英]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
,依此類推... ArrayIndexOutOfBoundsException
。 criteria1
和criteria2
也未使用。 這是代碼:
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.