从数组列表中随机选择

时间:2017-08-29 13:14:40

标签: java arraylist random

我想为messfood()随机选择一名学生。试图在那里打印学生姓名。每个星期,任何一个学生都应该被选中进行食物收费。试过String random = list.get(new Random().nextInt(list.size()));。但显示错误。帮助我。

public class Student {
int rollNo, yearOfStudy;
String fName, lName, activity;

Student(int rollNo, String fName, String lName, int yearOfStudy) {
    this.rollNo = rollNo;
    this.fName = fName;
    this.lName = lName;
    this.yearOfStudy = yearOfStudy;
}
public void display(){
    System.out.println("Roll Number: "+rollNo +"\nName: "+fName+ " "+lName + "\nYear Of Study: "+yearOfStudy+"\n\n");

}
public void messFood(){
    System.out.println("week 1, Mess food Incharge: ");

}

}

class Collection {
public static void main(String[] args) {
    Student s1 = new Student(1, "Alex", "Iwobi", 2013);
    Student s2 = new Student(2, "Denis", "Suarez", 2013);
    Student s3 = new Student(3, "Gerard", "Deulofeu", 2013);
    Student s4 = new Student(4, "Petr", "Cech", 2013);



    List studentList = new ArrayList();
    studentList.add(s1);
    studentList.add(s2);
    studentList.add(s3);
    studentList.add(s4);


    Iterator it = studentList.iterator();
    while(it.hasNext()){
        Student s=(Student)it.next();
        s.display();

    }
}

}

2 个答案:

答案 0 :(得分:1)

这正是您应该使用泛型的原因!您可能会遇到涉及预期和实际类型的运行时错误(与编译时错误相反)。

如果未使用泛型,您对list.get()的调用将返回Object,因此需要您进行投射。如果演员碰巧是错误,就像你的情况一样,它只会在运行时爆炸。如果您使用泛型,您的编译器会告诉您,您无法将Student类型转换为String类型!

看看我的版本:

public class Student {
    int rollNo, yearOfStudy;
    String fName, lName, activity;

    public Student(int rollNo, String fName, String lName, int yearOfStudy) {
        this.rollNo = rollNo;
        this.fName = fName;
        this.lName = lName;
        this.yearOfStudy = yearOfStudy;
    }

    @Override
    public String toString() {
        return new StringBuilder()
            .append("Roll Number: ").append(rollNo)
            .append("\nName: ").append(fName).append(" ").append(lName)
            .append("\nYear Of Study: ").append(yearOfStudy)
            .append("\n\n")
            .toString();
    }

    public void messFood() {
        // Establish mess food charge role
    }

    public static void main(String[] args) {
        Student s1 = new Student(1, "Alex", "Iwobi", 2013);
        Student s2 = new Student(2, "Denis", "Suarez", 2013);
        Student s3 = new Student(3, "Gerard", "Deulofeu", 2013);
        Student s4 = new Student(4, "Petr", "Cech", 2013);

        List<Student> studentList = new ArrayList<Student>();
        studentList.add(s1);
        studentList.add(s2);
        studentList.add(s3);
        studentList.add(s4);

        Iterator<Student> it = studentList.iterator();
        while (it.hasNext()) {
            Student s = it.next();
            System.out.println(s.toString());
        }

        Student randomStudent = getRandomItem(studentList);
        randomStudent.messFood();
        System.out.println("week 1, Mess food Incharge: ");
        System.out.println(randomStudent.toString());
    }

    private static <T> T getRandomItem(List<T> studentList) {
        return studentList.get(new Random().nextInt(studentList.size()));
    }
}

另外,除了泛型之外,我还添加了几个最佳实践,即更喜欢使用toString()来描述类而不是直接打印出来(你可以使用String无论如何你想要的,包括调用System.out.println())。

此外,我从messFood移出了打印,因为再一次,通常最好这样做。希望有所帮助!

修改:简要描述getRandomItem,尽量不要过于关注细节,但<T>表示会有替换{{1}的类型根据它的调用方式。根据它的定义方式,它会说如果您传递T包含类型List,我会返回一个对象T。在这种情况下,T转换为T,但我保持通用,因为它与其他列表同样有效。对于所有意图和目的,就好像签名如下:

Student

答案 1 :(得分:0)

list.get() 

将返回一个学生对象,而不是一个字符串,假设它是一个学生列表。

你应该做

Student random = list.get(new Random().nextInt(list.size()));
System.out.println(random.getFname + " " + random.getLname);

但当然你需要定义get方法。