为什么我无法在Java中的LinkedList中添加元素?

时间:2015-04-19 19:41:34

标签: java

这是我无法弄清楚的实验室的一部分......我无法弄清楚名册课程中的addGrade方法有什么问题,我必须为学生添加成绩,如果学生不存在,请创建一个新学生,然后添加成绩。请注意,最初,这个类没有实例变量Student stu,我在试图让事情发挥作用时添加了它。

为学生提供构造函数,学生分数保存在链接列表中。我只在这里放了一部分代码......它有方法来获取学生姓名,获得分数,增加分数,并获得平均分数。

我的代码在经过一些编辑后不再有效...当它部分工作时,它只是用最新的代码覆盖了以前的学生。学生a加入5年级,然后学生b加7,然后学生a再加10。这应该是学生a在链表中有2个条目(5,10)。当我运行我的代码时,它只有10岁的学生,但也没有完全工作。

public class Student {
private String name;
private List scores = new LinkedList<>();

  public Student(String name)
  {
     this.name = name;
  }

  public void addGrade(int score)
  {
     scores.add(score);
  }


public class Roster {

String name;
int score;
Student stu;

   //Adds a grade to the end of a list of grades for the named student.
   //Should work even if no student with this name has ever been seen before.
   public void addGrade(String name, int score) {
       Student temp = new Student(name);
       stu.addGrade(score);
   }
    //Gets the specified grade from the named student's scores.
   public int getGrade(String name, int index) {
       int a = stu.getScore(index);
       return a;
   }
    //Gets the average for the named student.
   public double getAverage(String name) {
       return stu.getAverage();
   }
}

3 个答案:

答案 0 :(得分:1)

名单是学生名单。

学生有一个分数列表。

这不是您需要的所有代码,只是您的Roster类和addGrade()方法的一部分:

public class Roster {
    List<Students> students = new LinkedList<Student>();

    public void addGrade(String name, int score) {
        // Student s = null;
        // Search for existing student.
        for (Student currentStu : students) {
            if (currentStu.name.equals(name) {
                s = currentStu;
            }
        }

        if (s == null) {
            //Student not in our roster. Add him.
            s = new Student(name);
        }

        // Add the score to that student.
        s.addGrade(score);
    }
}

答案 1 :(得分:0)

这段代码已经发生了很多事情,但我会给你一些关于可能出错的指示。我强烈建议你联系你的老师,导师或助教来关闭一些事情,但在大多数情况下,这是我看到的一些概念错误。

  • 学生是最基本的信息。名册中包含一系列学生。您可能希望在您的名册类中使用List<Student>。你不需要除名册之外的任何其他领域。

    您应该提供一种方法来为特定学生添加更多分数,但这个特殊方面我将留给您与您的老师讨论。

  • 您当前的链接列表分数声明是无类型​​的。这是不受欢迎的,因为您将在编译时生成未经检查的警告,如果您不小心在该链接列表中添加了非数字,那么在尝试对其进行数学运算时,您将在运行时收到错误。

    使用链表而不是数组支持列表也很有趣,因为您打算索引到列表中。出于性能原因,我建议使用ArrayList

    如上所述,您可以将其键入List<Integer> scores = new ArrayList<>()

  • 您需要一种方法来按名称搜索学生。这有点棘手,因为你在那里存储了Student个条目,但是可以做到。我将描述一种非常基本的方法,但我希望你从那里接受它:

    • 迭代你名单上所有学生的收集。
    • 如果学生的姓名与当前实例匹配,那么您就找到了您的学生。
    • 如果列表中没有包含该名称的学生,则必须返回一个代表该学生没有学生的数字。 0对于平均值是不好的,因为你可以的平均得分为0;也许-1会起作用。

答案 2 :(得分:0)

Map<String,Student>是关键所在:

public class Roster {
    private final Map<String, Student> students = new HashMap<>();

    //Adds a grade to the end of a list of grades for the named student.
    //Should work even if no student with this name has ever been seen before.
    public void addGrade(String name, int score) {
        Student stu = students.get(name);
        if (stu == null) {
            stu = new Student(name);
            students.put(name, stu);
        }
        stu.addGrade(score);
    }

    //Gets the specified grade from the named student's scores.
    public int getGrade(String name, int index) {
        Student student = students.get(name);
        if (student == null) {
            throw new IllegalStateException("Student not found: " + name);
        }
        return student.getScore(index);
    }

    //Gets the average for the named student.
    public double getAverage(String name) {
        Student student = students.get(name);
        if (student == null) {
            throw new IllegalStateException("Student not found: " + name);
        }
        return student.getAverage();
    }
}