2012-10-21 58 views
1

我必須實現一個演示如何使用數組對象列表的Java應用程序。我正在使用學生,並且我有一個StudentTest類。我應該可以輸入詳細信息(我已經完成)。我只是不確定如何通過學號來搜索數組列表中的特定對象並打印數組列表。任何提示將非常感謝。搜索數組列表中的特定對象並打印數組列表中的所有對象

到目前爲止的代碼:

package student; 

public class Student { 

    private String studentName; 
    private String studentNo; 
    private String email; 
    private int year; 

    public Student() { 
     this.studentName = null; 
     this.studentNo = null; 
     this.email = null; 
     this.year = -1; 
    } 

    public Student(String nName, String nNum, String nEmail, int nYr) { 
     this.studentName = nName; 
     this.studentNo = nNum; 
     this.email = nEmail; 
     this.year = nYr; 
    } 

    public void setStudentName(String newStudentName) { 
     this.studentName = newStudentName; 
    } 

    public void setStudentNo(String newStudentNo) { 
     this.studentNo = newStudentNo; 
    } 

    public void setEmail(String newEmail) { 
     this.email = newEmail; 
    } 

    public void setYear(int newYear) { 
     this.year = newYear; 
    } 

    public String getStudentName() { 
     return studentName; 
    } 

    public String getStudentNo() { 
     return studentNo; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public int getYear() { 
     return year; 
    } 

} 
package student; 

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

public class studentTest { 

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


     List<Student> Students = new ArrayList(); 


     System.out.println("Enter number of students"); 
     int countStudents = input.nextInt(); 

     for (int i = 0; i < countStudents; i++) { 
      Student student1 = new Student(); 
      System.out.println("Enter details for student: " + (i + 1)); 

      System.out.println("Enter name: "); 
      student1.setStudentName(input.next()); 

      System.out.println("Enter Number: "); 
      student1.setStudentNo(input.next()); 

      System.out.println("Enter email: "); 
      student1.setEmail(input.next()); 

      System.out.println("Enter year: "); 
      student1.setYear(input.nextInt()); 
      Students.add(student1); 



     } 
    } 
} 
+1

覆蓋'Student'類的'equals'方法。 –

回答

1

你需要實現你的Studentequals()方法,如果2名學生有相同studentNo,否則false將返回true。現在

@Override 
public boolean equals(Object ob) { 

    if (!(ob instanceof Student)) { 
     return false; 
    } 

    return ob.getStudentNo().equals(this.getStudentNo()); 
} 

,你可以使用contains方法來檢查student是否在List與否。

更新: -

此外,你需要重寫hashcode方法,每當你overridingequals方法,以保持它們之間的總承包合同。所以覆蓋hashcode會計算你instances僅僅基於要在其上比較您的objects

所以,你需要使用studentNo計算hashcode領域的hashcode

@Override 
public int hashcode() { 
    return this.getStudentNo().hashCode(); 
} 
  • 的hashCode計算algorithm應該是這樣的,如果兩個實例都是平等的,他們的哈希碼也應該等於
  • 應該爲同一個實例返回相同的值每次,當然當實例尚未改性。
  • 兩種不同的情況下可以有相同的哈希碼

正如評論建議由@hyde: -

如果這是隻爲你太多的工作,那麼你可以有不同的方法,它執行與equals方法相同的任務,例如,checkEquals()ignore重寫equals()方法。但在這種情況下,您需要對Listiteration執行每個列表元素,並調用methodstudent進行比較。

for(Student student: studentList) { 
    if (student.checkEquals(myStudent)) { 
     System.out.println("True"); 
    } 
} 
+0

這更像是一個挑逗,但在這種情況下,最好以不同方式命名方法,如isSame(),並使用循環進行搜索。即使(或者尤其是)在學校工作中,重寫equals也意味着重寫hashCode。 – hyde

+0

@hyde。哦耶。我完全忘了引用這個。 Goind編輯。 –

+0

@hyde。是的,我認爲我已經改善了我的職位,考慮了兩個方面。謝謝:) –

相關問題