2017-02-25 106 views
0

我想写一个控制器,检查输入从“学生”列表中获得正确的名称,并以某种方式,即使我给了正确的名称,循环继续。 我确定我错过了一些非常明显的东西。Java - 虽然循环仍然继续,即使它应该完成

下面是代码:

Scanner sc = new Scanner(System.in); 

String str = sc.nextLine(); 

while (!students.contains(str)){ 
    System.out.println("Try again"); 
    str = sc.nextLine(); 
} 

编辑: 问题是带班的“学生”名单这里的类和列表的样子:

// this gets filled right from a txt 
List<Student> students = new ArrayList<>(); 

public class Student{ 
    private String name; 
    private int gradeCount; 
    private int average; 
    private boolean homeWork; 
    ... 
} 

和我想要检查此类中的名称数据成员

+5

你的学生列表是什么样的? – bejado

+0

哦该死..这是一个列表,所以这可能是一个问题......:D对不起 – geri

+2

你的'学生'对象是什么样的? –

回答

2

您不能在Student列表中搜索String。你需要编写自己的方法,可能是这样的:

public boolean contains(List<Student> list, String s) { 
    for(Student student : list) 
     if(student.getName().equals(s)) return true; 
    return false; 
} 

然后,你可以这样做:

Scanner sc = new Scanner(System.in); 

while (!contains(students, sc.nextLine())) 
    System.out.println("Try again"); 

当然,这是假设你有name一个getter。

另一种选择是你的Student实现Comparable,使您可以使用各种方法Collections,你可以在Student对象彼此比较。这方面的一个例子是:

public class Student implements Comparable<Student> { 
    private String name; 

    public Student(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public int compareTo(Student s2) { 
     return name.compareTo(s2.getName()); 
    } 
} 

然后,您可以执行以下操作:

ArrayList<Student> students = new ArrayList<>(); 
students.add(new Student("Chris")); 
students.add(new Student("John")); 
students.add(new Student("Frank")); 
students.add(new Student("Devon")); 

Student me = new Student("Chris"); 
students.contains(me); // true 

既然你已经Comparable现已实现,还可以通过name使用Collections.sort(students)排序Student对象。

在Java中使用Comparablehttps://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/

+1

哇,真棒谢谢:D它是真正有帮助的,我真的很感激它:) – geri

+0

只要'Student'对象中'name'属性/字段是唯一标识符,这是一个好方法。也就是说,两个同名的'学生'对象指的是同一个“人”。 – Khaled

+0

@geri我在顶部添加了另一个例子来缩短代码:)希望它有帮助!请确保接受答案,如果它是你需要的 – Chris

0

假设有一个为Student对象一个getter更多的例子,你可以Student对象列表映射到学生的名字(字符串)的列表,然后在该执行.contains()通话名单。所以,试试这个:

Scanner sc = new Scanner(System.in); 
String str = sc.nextLine(); 

// Create a List<String> of student names 
List<String> names = students 
         .stream() 
         .map(student -> student.getName()) 
         .collect(Collectors.toList()); 

while (!names.getName().contains(str)){ 
    System.out.println("Try again"); 
    str = sc.nextLine(); 
} 
1

用户底漆阅读:

import java.util.ArrayList; 
import java.util.Scanner; 

public class Sandbox { 

public static void main(String[] args) { 
    Scanner keyboard = new Scanner(System.in); 
    Boolean found = false; 
    String input; 

    ArrayList<Student> students = new ArrayList<Student>(); 
    students.add(new Student("Jim")); 
    students.add(new Student("Kim")); 
    students.add(new Student("Bill")); 
    students.add(new Student("Betty")); 

    System.out.println("Enter the name of a student to check"); 
    input = keyboard.nextLine(); 
    if(students.get(0).getName().equals(input)) { 
     System.out.println("You found " + students.get(0).getName()); 
     found = true; 
     keyboard.close(); 
    } 
    while(!found) { 
     System.out.println("Try again"); 
     input = keyboard.nextLine(); 
     for(int i = 1; i < students.size(); i++) { 
      if(students.get(i).getName().equals(input)) { 
       System.out.println("You found " + students.get(i).getName()); 
       found = true; 
       keyboard.close(); 
       break; 
      } 
     } 
    } 
} 

Student类

public class Student { 
    String name; 

    public Student() { 

    } 

    public Student (String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 
} 
+0

这段代码有什么问题?这正是他所说的他想做的。 –

0

扫描仪SC =新的扫描仪(System.in);

String str = null;
boolean isFound = false;
while(!isFound)
{
str = sc.nextLine();
(学生stdObj:学生)
if(stdobj.name。等于(str))
{
isFound = true;
break;
}
if(!isFound)
System.out.println(“Try again”);
}

+0

你的学生数组列表已经有一些学生对象 – surajy79