java - 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
解决方案
这是我得到的。.
- 将您
Scanner
的替换为BufferedReader
以读取文件。 - 循环遍历文件中的所有行,并在循环时将它们附加到
StringBuilder
变量中。 - 完成后,使用该
split
方法获取包含所有单词的数组。 - 现在,您可以循环您获得的数组。数组中的第零个元素将是您
string1
的,第一个元素将string2
在您的第一个三重嵌套 for 循环中,依此类推... - 请注意,单词数为 120。您的三重嵌套 for 循环将运行 (30*6*5) = 900 次。这会导致
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
推荐阅读
- javascript - 检查页面中是否呈现了 javascript DOM 元素
- jasmine - 如何在 Protractor 中使用 Jasmine 3.3 或更高版本?
- neo4j - Neo4J子查询相同的属性来计算比率
- reactjs - Expect 不是反应测试库中的函数
- angularjs - 有没有办法在新的角度应用程序中找到pendingReuests
- machine-learning - 不完整数据的均值居中
- javascript - CSS - 模糊 div 内的模糊 div 问题
- javascript - “即使其 MIME 类型(“text/html”)不是有效的 JavaScript MIME 类型,也已加载 php 脚本”错误
- swift - 转换 Binding 类型的两个值
绑定 - javascript - React 自动完成获取对象 onchange 事件