我的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

我的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

此代码用于获取分数的最小和最大平均值。但是,当它试图显示最小分数时,结果是保持显示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.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);
    }
}