2017-08-29 194 views
-4

我想随机选择一个学生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(); 

    } 
} 

} 
+1

您正在使用原始集合并期望'String'而不是'Student'。 – Mena

+2

什么是错误? –

+0

当然,阅读错误消息可能会有所帮助。 – Gassa

回答

0
list.get() 

会返回一个学生对象,而不是一个字符串,假设它的学生名单。

你应该做

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

不过,当然,你需要得到定义的方法。

+0

这不是一个完整的答案。您应该向OP展示正确的进行方式,而不仅仅是他做错了什么。 –

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())); 
    } 
} 

此外,除了仿制药,我加了几个最佳实践,即prefering使用toString()描述类,而不是直接打印出来(之后您可以随意使用String,包括致电System.out.println())。

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

编辑:简要描述getRandomItem,尽量不要在细节上太赶了上来,但<T>说,会有一个类型,根据它如何被称为取代T。根据它是如何定义的,它说如果你通过一个List包含T,我会回到你的对象T。在这种情况下,T转换为Student,但我保持通用,因为它与其他列表的工作方式一样。对于所有意图和目的,它好像签名如下:

private static Student getRandomItem(List<Student> studentList)