sum&的静态函数的compareTo

时间:2018-05-20 15:52:29

标签: java

好的,基本上这是我关于学生和学生的课程。学生团体; 每个学生都有姓名,身份证和分数/分; 该程序工作正常,但缺少的是StudentGroup类中的SUM函数需要静态并且取一个" Group"的参数。其中你需要点数之和。我的问题是,当我将函数和ArrayList置于静态时,该函数返回两个组合得分并且我不知道如何使其工作

  

//程序正常工作并返回正确的值   一切;我只是在尝试更改时才会收到这些错误   sumOfPoints函数为静态

我拥有的两个文件是: 第1组:

61662126 Laurel 50
61662213马克35.5
61662345 Yanny 67
61662127拉里27
61662125 Kevin 87.5

和第2组:

61662126 Jason 70

61662213 Josh 25.5

61662345 Bobby 57

61662127 Megan 17

61662125德雷克86.5

正确的输出应该是: 第1组总分:267.0

第2组总分:256.0

将Group1与Group2进行比较:1

但是当我把它放到静态时它会返回两者中的523,这两个组合在一起并且我不明白我做错了什么

public interface IFile
{
    public void Load();
}





public class Student implements Comparable<Student> 
{

    private int facnum;
    private String name;
    private double points;

    public Student(int fn, String n, double p)
    {
        this.facnum = fn;
        this.name = n;
        this.points = p;
    }

    public void SetFN(int fn)
    {
        this.facnum = fn;
    }

    public void SetName(String n)
    {
        this.name = n;
    }

    public void SetPoints(double p)
    {
        this.points = p;
    }

    public int GetFN()
    {
        return this.facnum;
    }

    public String GetName()
    {
        return this.name;
    }

    public double GetPoints()
    {
        return this.points;
    }

        public boolean equals(Object s)
{
    if (this.GetFN() != ((Student)s).GetFN())
    {
        return false;
    }
        return true;
}

public int compareTo(Object s) 
{
    if(this.GetFN() < ((Student)s).GetFN())
    {
        return -1;
    }
    if(this.GetFN() > ((Student)s).GetFN())
    {
        return 1;
    }
    return 0;
}


    public String toString()
    {
        return "Faculty Number: " + this.facnum + " Name: " + this.name + " Points: " + this.points + " \n";
    }
}




import java.io.*;
import java.util.*;

public class StudentsGroup implements IFile, Comparable<Object>
{
    private String groupname;
    private List<Student>oStudent = new ArrayList<Student>();

    public StudentsGroup(String filename)
    {
        this.groupname = filename;
        Load();
    }

    public void Load(){
        try 
        {   
            Scanner sc=new Scanner(new File(this.groupname));
            while(sc.hasNextLine())
            {
                oStudent.add(new Student(sc.nextInt(),sc.next(),
                        sc.nextDouble()));
            }
        sc.close();
        }
        catch(IOException e)
        {
            System.out.println("Input/Output Error...");
        }
    }


    public void printColl()
    {
        System.out.println(oStudent.toString());
    }

    public  List<Student> sortedListFN()
    {
        Collections.sort(oStudent);
        return oStudent;
    }

    public double sumOfPoints()
    {
        double sum = 0.00;

        for(Iterator<Student> it= oStudent.iterator(); it.hasNext();)
        {
            Student c = it.next();
            sum += c.GetPoints();
        }
        return sum;
    }

    public int compareTo(Object s) 
    {
        if(this.sumOfPoints() < ((StudentsGroup) s).sumOfPoints())
        {
            return -1;
        }
        if(this.sumOfPoints() > ((StudentsGroup) s).sumOfPoints())
        {
            return 1;
        }
        return 0;
    }


    public static void main(String[] args)
    {
        StudentsGroup oGroup1 = new StudentsGroup("Group1.txt");
        oGroup1.printColl();
        System.out.println("Sorted order by FN: " + oGroup1.sortedListFN() + "\n");
        StudentsGroup oGroup2 = new StudentsGroup("Group2.txt");
        System.out.println("Total points of Group1: " + oGroup1.sumOfPoints() + "\n");
        System.out.println("Total points of Group2: " + oGroup2.sumOfPoints() + "\n");
        System.out.println("Comparing Group1 to Group2: " + oGroup1.compareTo(oGroup2));

    }


}

编辑//我尝试的静态方法是将oStudent更改为static:

private static List<Student>oStudent = new ArrayList<Student>();

显然将sum函数改为static&amp;编辑compareTo方法:

public static double sumOfPoints(Object s)
    {
        double sum = 0.00;
        s  = new ArrayList<Student>(oStudent);

        for(Iterator<Student> it= ((List<Student>) s).iterator(); it.hasNext();)
        {
            Student c = it.next();
            sum += c.GetPoints();
        }
        return sum;
    }

    public int compareTo(Object s) 
    {
        if(this.sumOfPoints(this) < ((StudentsGroup) s).sumOfPoints(s))
        {
            return -1;
        }
        if(this.sumOfPoints(this) > ((StudentsGroup) s).sumOfPoints(s))
        {
            return 1;
        }
        return 0;
    }

和输出:

System.out.println("Total points of Group1: " + oGroup1.sumOfPoints(oGroup1) + "\n");
        System.out.println("Total points of Group2: " + oGroup2.sumOfPoints(oGroup2) + "\n");
        System.out.println("Comparing Group1 to Group2: " + oGroup1.compareTo(oGroup2));

and the output starts returning 523

1 个答案:

答案 0 :(得分:1)

您的静态方法会使用该特定实例类的内部对象覆盖s

s  = new ArrayList<Student>(oStudent);

我认为你的错误就在这里。这不是你如何使用类的静态方法。正确的方法是StudentsGroup.sumOfPoints(yourObjectHere)。静态方法不应该知道特定实例的任何字段。