我的txtfile读取器程序出错 导入java.io.File; 导入java.io.FileNotFoundException; 导入java.util.ArrayList; 导入java.util.List; 导入java.util.Scanner; 导入java.util.StringTokenizer; 公共班级平均成绩{ 私有字符串文件名; 私人名单残疾人士; 私人名单; 公开课平均成绩(){ invalidEntries=newarraylist(); validEntries=新ArrayList(); } 私有静态类条目{ 私有字符串名称; 私人名单职系; 公众进入(){ 等级=新的ArrayList(); 公共空白添加(整数g){ 增加(g); } 公共void集合名(字符串名){ this.name=名称; } 公共双平均值(){ 如果(grades.size()==0) 返回0.0; 双平均值=0.0; 用于(整数x:等级){ 平均值+=x; } 平均值/=等级。尺寸(); 返回平均值; } 公共字符串toString(){ 返回名称+“”+getAverage()+“\n”; } } 公共静态void main(字符串[]args){ GradeAverage gradeApp=新的GradeAverage(); System.out.println(“gradesheet.txt”); gradeApp.setFilename(“gradesheet.txt”); gradeApp.readFile(); gradeApp.process(); } 私有无效进程(){ 条目最大值=新条目(); 条目min=新条目(); 用于(条目:validEntries){ if(max.getAverage()=entry.getAverage()) { 系统输出打印项次(“读取”); 最小值=输入; } } 系统输出打印(“最大值:\t”+MAX); 系统输出打印(“最小:\t”+MIN); System.out.println(“\n包含条目:”); 用于(字符串str:invalidEntries){ 系统输出打印项次(str); } } 私有void readFile(){ 扫描仪输入=空; 试一试{ in=新扫描仪(新文件(文件名)); }捕获(FileNotFoundException e1){ 系统出口(404); } while(在.hasNext()中){ 字符串nextLine=in.nextLine(); 试一试{ 条目=新条目(); StringTokenizer tokenizer=新的StringTokenizer(nextLine); String name=tokenizer.nextToken(); 如果(!有效(名称)) 抛出新异常(); entry.setName(name); while(tokenizer.hasMoreTokens()){ add(Integer.parseInt(tokenizer.nextToken()); } validEntries.添加(条目); //系统输出打印(“添加\n”+条目); } 捕获(例外e){ 无效标识。添加(下一行); } } in.close(); } 私有布尔值有效(字符串名称){ 对于(int i=0;i
此代码用于获取分数的最小和最大平均值。但是,当它试图显示最小分数时,结果是保持显示null 0.0。以下是示例 输入 I 30 12 43 64 46爱 代码22 2 113 somuch 13 99 输出 成绩表.txt 最大值:somuch 56.0 最小值:null 0.0 不包括参赛作品:64 46 我做错了什么?我真的需要帮助…问题是,在这方面:我的txtfile读取器程序出错 导入java.io.File; 导入java.io.FileNotFoundException; 导入java.util.ArrayList; 导入java.util.List; 导入java.util.Scanner; 导入java.util.StringTokenizer; 公共班级平均成绩{ 私有字符串文件名; 私人名单残疾人士; 私人名单; 公开课平均成绩(){ invalidEntries=newarraylist(); validEntries=新ArrayList(); } 私有静态类条目{ 私有字符串名称; 私人名单职系; 公众进入(){ 等级=新的ArrayList(); 公共空白添加(整数g){ 增加(g); } 公共void集合名(字符串名){ this.name=名称; } 公共双平均值(){ 如果(grades.size()==0) 返回0.0; 双平均值=0.0; 用于(整数x:等级){ 平均值+=x; } 平均值/=等级。尺寸(); 返回平均值; } 公共字符串toString(){ 返回名称+“”+getAverage()+“\n”; } } 公共静态void main(字符串[]args){ GradeAverage gradeApp=新的GradeAverage(); System.out.println(“gradesheet.txt”); gradeApp.setFilename(“gradesheet.txt”); gradeApp.readFile(); gradeApp.process(); } 私有无效进程(){ 条目最大值=新条目(); 条目min=新条目(); 用于(条目:validEntries){ if(max.getAverage()=entry.getAverage()) { 系统输出打印项次(“读取”); 最小值=输入; } } 系统输出打印(“最大值:\t”+MAX); 系统输出打印(“最小:\t”+MIN); System.out.println(“\n包含条目:”); 用于(字符串str:invalidEntries){ 系统输出打印项次(str); } } 私有void readFile(){ 扫描仪输入=空; 试一试{ in=新扫描仪(新文件(文件名)); }捕获(FileNotFoundException e1){ 系统出口(404); } while(在.hasNext()中){ 字符串nextLine=in.nextLine(); 试一试{ 条目=新条目(); StringTokenizer tokenizer=新的StringTokenizer(nextLine); String name=tokenizer.nextToken(); 如果(!有效(名称)) 抛出新异常(); entry.setName(name); while(tokenizer.hasMoreTokens()){ add(Integer.parseInt(tokenizer.nextToken()); } validEntries.添加(条目); //系统输出打印(“添加\n”+条目); } 捕获(例外e){ 无效标识。添加(下一行); } } in.close(); } 私有布尔值有效(字符串名称){ 对于(int i=0;i,java,Java,此代码用于获取分数的最小和最大平均值。但是,当它试图显示最小分数时,结果是保持显示null 0.0。以下是示例 输入 I 30 12 43 64 46爱 代码22 2 113 somuch 13 99 输出 成绩表.txt 最大值:somuch 56.0 最小值:null 0.0 不包括参赛作品:64 46 我做错了什么?我真的需要帮助…问题是,在这方面: import java.io.File; import java.io.FileNotFoundException; import java
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
public class GradeAverage {
private String filename;
private List<String> invalidEntries;
private List<Entry> validEntries;
public GradeAverage() {
invalidEntries = new ArrayList<>();
validEntries = new ArrayList<>();
}
private static class Entry{
private String name;
private List<Integer> grades;
public Entry() {
grades = new ArrayList<>();
public void add(int g){
grades.add(g);
}
public void setName(String name){
this.name = name;
}
public double getAverage(){
if(grades.size() == 0)
return 0.0;
double avg = 0.0;
for(Integer x: grades){
avg += x;
}
avg /= grades.size();
return avg;
}
public String toString(){
return name + " " + getAverage() + "\n";
}
}
public static void main(String[] args) {
GradeAverage gradeApp = new GradeAverage();
System.out.println("gradesheet.txt");
gradeApp.setFilename("gradesheet.txt");
gradeApp.readFile();
gradeApp.process();
}
private void process() {
Entry max = new Entry();
Entry min = new Entry();
for(Entry entry : validEntries){
if(max.getAverage() < entry.getAverage())
{
max = entry;
}
if(min.getAverage() >= entry.getAverage())
{
System.out.println("READ");
min = entry;
}
}
System.out.print("MAX:\t"+max);
System.out.print("MIN:\t"+min);
System.out.println("\nExcluded Entries:");
for(String str: invalidEntries){
System.out.println(str);
}
}
private void readFile() {
Scanner in = null;
try {
in = new Scanner(new File(filename));
} catch (FileNotFoundException e1) {
System.exit(404);
}
while(in.hasNext()){
String nextLine = in.nextLine();
try{
Entry entry = new Entry();
StringTokenizer tokenizer = new StringTokenizer(nextLine);
String name = tokenizer.nextToken();
if(!valid(name))
throw new Exception();
entry.setName(name);
while(tokenizer.hasMoreTokens()){
entry.add(Integer.parseInt(tokenizer.nextToken()));
}
validEntries.add(entry);
// System.out.print("added\n"+entry);
}
catch(Exception e){
invalidEntries.add(nextLine);
}
}
in.close();
}
private boolean valid(String name) {
for(int i = 0; i < name.length(); ++i){
if(!Character.isLetter(name.charAt(i)))
return false;
}
return true;
}
private void setFilename(String filename) {
this.filename = filename;
}
}
在使用类似算法查找最小值/最大值时,使用列表的第一个元素初始化默认值(Entry max
和Entry min
)被认为是明智的。因此将前一个更改为
Entry max = new Entry(); // defaultly constructed, so max.getAverage() == 0
Entry min = new Entry(); // defaultly constructed, so min.getAverage() == 0
for(Entry entry : validEntries){ // entry has only positive grades
....
if(min.getAverage() >= entry.getAverage()) // 0 >= 'something, greater than 0' is always false.
}
在您的代码中,只要没有负值,以下代码部分将使min保持0.0。请参阅下面的注释:
Entry max = validEntries[0];
Entry min = validEntries[0];
Entry max=new Entry();
条目min=新条目();
//min.getAverage()首次为0.0
//max.getAverage()首次为0.0
用于(条目:validEntries){
if(max.getAverage()=entry.getAverage())
{
/*为0.0>=entry.getAverage(),除非entry.getAverage小于0.0,否则为否。因此,在entry.getAverage()不是负值之前,不会执行此条件*/
系统输出打印项次(“读取”);
最小值=输入;
}
}
我决定当for循环通过第一个条目时,我将使用条目的平均值设置min和max,比如x(使用布尔标志)在随后的循环中,我比较了先前存储在最小值和最大值中的值,我保证总是得到正确的值。如果只有一个输入,那么最小值和最大值都是相同的,如果有多个输入,那么最小值和最大值都被分配了正确的值。
见下文:
Entry max = new Entry();
Entry min = new Entry();
//min.getAverage() is 0.0 for the first ever time
//max.getAverage() is 0.0 for the first ever time
for(Entry entry : validEntries){
if(max.getAverage() < entry.getAverage())
{
//0.0 is < entry.getAverage(), so max works file
max = entry;
}
if(min.getAverage() >= entry.getAverage())
{
/* is 0.0 >= entry.getAverage(), no unless entry.getAverage is less than 0.0 hence, this condition is not executed until the entry.getAverage() is not a negative value */
System.out.println("READ");
min = entry;
}
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Scanner;
导入java.util.StringTokenizer;
公共班级平均成绩{
私有字符串文件名;
私人名单残疾人士;
私人名单;
公开课平均成绩(){
invalidEntries=newarraylist();
validEntries=新ArrayList();
}
私有静态类条目{
私有字符串名称;
私人名单职系;
公众进入(){
等级=新的ArrayList();
}
公共空白添加(整数g){
gr
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
public class GradeAverage {
private String filename;
private List<String> invalidEntries;
private List<Entry> validEntries;
public GradeAverage() {
invalidEntries = new ArrayList<>();
validEntries = new ArrayList<>();
}
private static class Entry{
private String name;
private List<Integer> grades;
public Entry() {
grades = new ArrayList<>();
}
public void add(int g){
grades.add(g);
}
public void setName(String name){
this.name = name;
}
public double getAverage(){
if(grades.size() == 0)
return 0.0;
double avg = 0.0;
for(Integer x: grades){
avg += x;
}
avg /= grades.size();
return avg;
}
public String toString(){
return name + " " + getAverage() + "\n";
}
}
public static void main(String[] args) {
GradeAverage gradeApp = new GradeAverage();
System.out.println("gradesheet.txt");
gradeApp.setFilename("gradesheet.txt");
gradeApp.readFile();
gradeApp.process();
}
private void process() {
Entry max = new Entry();
Entry min = new Entry();
//first loop, assign both min and max entry
boolean firstTime = true;
for(Entry entry : validEntries){
//first time only
if(firstTime) {
max = entry;
min = entry;
firstTime = false;
} else {
//now search for minimum and maximum
if(max.getAverage() < entry.getAverage())
{
max = entry;
}
if(min.getAverage() >= entry.getAverage())
{
//System.out.println("READ MIN " + min.toString());
min = entry;
}
}
}
System.out.print("MAX:\t"+max);
System.out.print("MIN:\t"+min);
System.out.println("\nExcluded Entries:");
for(String str: invalidEntries){
System.out.println(str);
}
}
private void readFile() {
Scanner in = null;
try {
in = new Scanner(new File(filename));
} catch (FileNotFoundException e1) {
System.exit(404);
}
while(in.hasNext()){
String nextLine = in.nextLine();
try{
Entry entry = new Entry();
StringTokenizer tokenizer = new StringTokenizer(nextLine);
String name = tokenizer.nextToken();
if(!valid(name))
throw new Exception();
entry.setName(name);
while(tokenizer.hasMoreTokens()){
entry.add(Integer.parseInt(tokenizer.nextToken()));
}
validEntries.add(entry);
System.out.print("added\n"+entry.toString());
}
catch(Exception e){
invalidEntries.add(nextLine);
}
}
in.close();
}
private boolean valid(String name) {
for(int i = 0; i < name.length(); ++i){
if(!Character.isLetter(name.charAt(i)))
return false;
}
return true;
}
private void setFilename(String filename) {
this.filename = filename;
}
}
private void process() {
Entry max = new Entry();
Entry min = new Entry();
//first loop, assign both min and max entry
boolean firstTime = true;
for(Entry entry : validEntries){
//first time only
if(firstTime) {
max = entry;
min = entry;
firstTime = false;
} else {
//now search for minimum and maximum
if(max.getAverage() < entry.getAverage())
{
max = entry;
}
if(min.getAverage() >= entry.getAverage())
{
//System.out.println("READ MIN " + min.toString());
min = entry;
}
}
}
System.out.print("MAX:\t"+max);
System.out.print("MIN:\t"+min);
System.out.println("\nExcluded Entries:");
for(String str: invalidEntries){
System.out.println(str);
}
}