4.写一个Student类, 包含属性id[1-30), grade[1-6], score[0-100], 所有属性都是随机生成  
创建一个Set集合, 保存20个对象, 如果两个对象的id是一样的,则不允许添加.  
使用迭代器遍历集合,打印输出对象的信息, 并找出分数最高的同学和分数最低的同学, 最后打印输出最高分和最低分同学信息。
代码敬上,我想问我运行时每次遍历到第七个学生的score都读不出来,这是为什么???? 有人能解决一下吗,感谢。Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package cn.yann.exp4;
 
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
 
package cn.yann.exp4;
 
public class Student {
    private int id;
    private int grade;
    private int score;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getGrade() {
        return grade;
    }
    public void setGrade(int grade) {
        this.grade = grade;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public Student(){
        id = (int)(Math.random()*28) + 1;
        grade = (int)(Math.random()*5) + 1;
        score = (int)(Math.random()*100);
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (id != other.id)
            return false;
        return true;
    }
     
     
}public class Test {public static void main(String[] args) {
Set<Student> s = new HashSet<Student>();
int i = 1;
while( i <= 20){
Student stu = new Student();
if(s.contains(stu)){
System.out.println("id相同,添加失败");
System.out.println(stu.getId());
}
else{
s.add(stu);
System.out.println("添加学生"+i+"成功:"+stu.getId());
i++;
}
}Iterator<Student> it = s.iterator();
i = 1;
while(it.hasNext()){
System.out.print("学生"+i+"id:"+it.next().getId()+"  ");
System.out.print("grade:"+it.next().getId()+"  ");
System.out.print("score:"+it.next().getId());
System.out.println();
i++;
}}}

解决方案 »

  1.   

    最后打印的地方改一下 每次调用next的时候都会让迭代器指向下一个的while (it.hasNext()) {
    Student tempStu = it.next();
    System.out.println("学生" + i + "id:" + tempStu.getId() + " grade:" + tempStu.getGrade() + "  score:" + tempStu.getScore());
    i++;
    }
      

  2.   

    最后显示那里每次while循环都调用了三次it.next().所以自然会20/3=7,所以到了第七个的时候就出现问题了.
      

  3.   

    it.next()没调用一次  指针都要指向下一个   所以用个东西接收下it.next()就可以了
      

  4.   

    这是你想实现的代码,在创建randomId时,*30+1满足30个学生,并且在迭代器部分多次使用了it.next();导致超出了迭代器循环的范围
    public class Student {
        private int id;
        private int grade;
        private int score;
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public int getGrade() {
    return grade;
    }
    public void setGrade(int grade) {
    this.grade = grade;
    }
    public int getScore() {
    return score;
    }
    public void setScore(int score) {
    this.score = score;
    }
    @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + grade;
    result = prime * result + id;
    result = prime * result + score;
    return result;
    }
    @Override
    public boolean equals(Object obj) {
    if (this == obj)
    return true;
    if (obj == null)
    return false;
    if (getClass() != obj.getClass())
    return false;
    Student other = (Student) obj;
    if (grade != other.grade)
    return false;
    if (id != other.id)
    return false;
    if (score != other.score)
    return false;
    return true;
    }
    public Student(){
            id = (int)(Math.random()*30) + 1;
            grade = (int)(Math.random()*5) + 1;
            score = (int)(Math.random()*100)+1;
        }
         
         
    }
    public class Test { public static void main(String[] args) {

    Set<Student> s = new HashSet<Student>();

    int i = 1;
    while( i <= 30){
    Student stu = new Student();
    if(s.contains(stu)){
    System.out.println("id相同,添加失败");
    System.out.println(stu.getId());
    }
    else{
    s.add(stu);
    System.out.println("添加学生"+i+"成功:"+stu.getId());
    i++;
    }
    } Iterator<Student> it = s.iterator();
    int j = 1;
    do{
    Student stu = it.next();
    System.out.print("学生"+j+"id:"+stu.getId()+"  ");
    System.out.print("grade:"+stu.getGrade()+"  ");
    System.out.print("score:"+stu.getScore());
    System.out.println();
    j++;
    }while(it.hasNext());
    }}