2017-02-25 113 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