从数组列表中随机选择
我想随机选择一个学生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();
}
}
}
list.get()
会返回一个学生对象,而不是一个字符串,假设它的学生名单。
你应该做
Student random = list.get(new Random().nextInt(list.size()));
System.out.println(random.getFname + " " + random.getLname);
不过,当然,你需要得到定义的方法。
这不是一个完整的答案。您应该向OP展示正确的进行方式,而不仅仅是他做错了什么。 –
这正是您应该使用泛型的原因!您可能会遇到涉及预期类型和实际类型的运行时错误(与编译时错误相对)。
如果不使用泛型,请致电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)
您正在使用原始集合并期望'String'而不是'Student'。 – Mena
什么是错误? –
当然,阅读错误消息可能会有所帮助。 – Gassa