简单的ArrayList程序-JAVA

3

我想解决这个问题:

定义一个名为Student的类,其属性为1030Y模块中的学生ID和分数。类Student还必须包含一个默认构造函数以及用于初始化类型为Student的对象的构造函数(该对象具有用户定义的值),每个属性的修改器和访问器方法以及一个显示方法。编写一个测试程序,该程序维护一个学生对象的ArrayList(ID在701-799范围内,并且成绩在0.0到100.0之间)。该程序将允许用户输入学生ID号码和每个学生的分数。在完成所有输入后,程序将显示得分最高和最低的学生的ID。

由于某种原因,我无法获取学生中最低和最高分数的部分不起作用。

以下是我的代码:
Student.java:

package Number5;

public class Student {
private int studentID;
private float mark;

public Student()
{
    studentID = 0;
    mark = 0;
}

public Student(int id, float marks)
{
    this.studentID = id;
    this.mark = marks;
}

public void setID(int id)
{
    this.studentID = id;
}

public int getID()
{
    return studentID;
}

public void setMark(float marks)
{
    this.mark = marks;
}

public float getMark()
{
    return mark;
}

public void display()
{
    System.out.println("Student ID: "+getID());
    System.out.println("Marks: "+getMark());
}
}

testStudent.java:

package Number5;
import java.util.ArrayList;
import java.util.Scanner;

public class testStudent {

public static void main(String[] args) {
    ArrayList<Student> students = new ArrayList<Student>();
    int id=0; float mark=0;
    Scanner input = new Scanner(System.in);

    do
    {
        System.out.print("Enter the student ID: ");
        id = input.nextInt();
        System.out.print("Enter the marks: ");
        mark = input.nextFloat();
        students.add(new Student(id,mark));
    }
    while(id != 0 || mark != 0);

    int smallest = 9999, largest = -9999;

    for(int i=0; i<students.size(); i++)
    {
        while(smallest > students.get(i).getMark())
        {
            smallest = students.get(i).getID();
        }

        while(largest < students.get(i).getMark())
        {
            largest = students.get(i).getID();
        }
    }

    System.out.println("Smallest is "+smallest);
    System.out.println("Largest is "+largest);
}
}

程序在读取用户输入后就停止了。它甚至没有执行for循环。

显然,我的代码可能是错误的,对吧?如果我确切知道哪里出错了,我也不会来问了。 - Manisha Singh Sanoo
当然,他们可能是错的,但问题是,到底哪里出了问题?你没有说出你的问题是什么。 - user2030052
2
@RaGe #define define undef - Mike G
2
@downvoter,您能解释一下原因吗?这样我就不会再犯同样的错误了。在Java方面是初学者有错吗? - Manisha Singh Sanoo
1
你代码中的问题不在于ArrayList。 - Fildor
显示剩余6条评论
5个回答

3

您的问题似乎是在使用while语句进行检查时进入了无限循环。请使用if语句,如下所示:

for(int i=0; i<students.size(); i++)
    {
        if(students.get(i).getMark() < smallest)
        {

            smallest = students.get(i).getID();
        }

        if(students.get(i).getMark() > largest)
        {

            largest = students.get(i).getID();
        }
    }

然而,这样做会让你面临另一个问题,即你正在将markid进行比较。你需要将mark的值与mark进行比较,然后再分配id。代码如下:

int largestMark = 0;
inst smallestMark = 9999;
for(int i=0; i<students.size(); i++)
    {
        if(students.get(i).getMark() < smallestMark)
        {
            smallestMark = students.get(i).getMark();
            smallest = students.get(i).getID();
        }

        if(students.get(i).getMark() > largestMark)
        {
            largestMark = students.get(i).getMark();
            largest = students.get(i).getID();
        }
    }

很高兴能帮到你。祝你好运。 - BlackHatSamurai

1

使用:

if(smallest > students.get(i).getMark())
{
    smallest = students.get(i).getMark();
}

if(largest < students.get(i).getMark())
{
    largest = students.get(i).getMark();
}

你在比较分数,但随后又赋予了id。为了跟踪得分最高或最低的学生,你可以添加以下代码:
studentWithMostMarks = students.get(i).getId()

1
该程序将允许用户输入学生的ID号和每个学生的分数。当所有输入完成后,该程序将显示得分最高和最低的学生的ID号。
while(smallest > students.get(i).getMark()) {
    smallest = students.get(i).getID();
}

while(largest < students.get(i).getMark()) {
  largest = students.get(i).getID();
}

你应该将分配给最小或最大值,而不是ID。
你也可以跟踪具有最高或最低分数的students的索引号,然后从students数组列表中获取id和分数。

尽管在这种情况下while循环可以工作,但我会用if语句替换它,因为这样可以使代码更易读。 - nullPointer
1
感谢,同意。只指出了错误的部分,还没有进行优化。 - Haifeng Zhang
@downvoter。你能解释一下为什么要点踩吗?在我看来,我们需要指出OP的逻辑错误并帮助他,代码优化是使代码更易读和更有效运行,但这是可选的。 - Haifeng Zhang
这并没有解决问题。您没有更改任何代码。它不会打印出最高或最低分数的 ID。您还将标记与 ID 进行比较。 - BlackHatSamurai
@BlackHatSamurai 那是原始代码,不是我的,我只是指出哪里有问题。我的解释在下面。 - Haifeng Zhang
@BlackHatSamurai 如果我是你,我会将students.get(i).getMark()在这两个if条件语句中分配给一个本地的int变量,因为它被调用了4次。重构后的代码将更加清晰易读,不冒犯之意。 - Haifeng Zhang

1

你需要一个额外的变量:

目前你把最好和最差的学生ID存储在smallest/largest中,而与mark进行比较。你需要像这样的东西:

smallestId;
smallestMark;//initialize biig
largestId;
largestMark;//initialize looow

1
这段代码很可能会导致无限循环:
for(int i=0; i<students.size(); i++)
{
    while(smallest > students.get(i).getMark())
    {
        smallest = students.get(i).getID();
    }

    while(largest < students.get(i).getMark())
    {
        largest = students.get(i).getID();
    }
}

你需要改变它:
for(int i=0; i<students.size(); i++)
{
    if(smallest > students.get(i).getMark())
    {
        smallest = students.get(i).getID();
    }

    if(largest < students.get(i).getMark())
    {
        largest = students.get(i).getID();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接