各位大佬,為什么我重寫了equals方法運行containsValue方法報錯
學生類:
package com.map;
import java.util.HashSet;
import java.util.Set;
//學生類
public class Student {
?? ?public String id;
?? ?public String name;
?? ?// 課程信息存放在一個set類型的屬性里
?? ?public Set <Course>courses;
?? ?public Student(String id, String name) {
?? ??? ?this.id = id;
?? ??? ?this.name = name;
?? ??? ?// 把courses屬性實例化。不能直接實例化Set,因為它是一個接口。
?? ??? ?// 通過一個HashSet對Set進行實例化
?? ??? ?this.courses = new HashSet<Course>();
?? ?}
?? ?@Override
?? ?public int hashCode() {
?? ??? ?final int prime = 31;
?? ??? ?int result = 1;
?? ??? ?result = prime * result + ((name == null) ? 0 : name.hashCode());
?? ??? ?return result;
?? ?}
?? ?@Override
?? ?public boolean equals(Object obj) {
?? ??? ?if (this == obj)
?? ??? ??? ?return true;
?? ??? ?if (!(obj instanceof Student))
?? ??? ??? ?return false;
?? ??? ?Student other = (Student) obj;
?? ??? ?if (name == null) {
?? ??? ??? ?if (other.name != null)
?? ??? ??? ??? ?return false;
?? ??? ?} else if (!name.equals(other.name))
?? ??? ??? ?return false;
?? ??? ?return true;
?? ?}
}
MapTest類:
package com.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import com.collection.list.Student;
public class MapTest {
?? ?// 用來承裝學生類型對象
?? ?public Map<String, Student> students;
?? ?// 在構(gòu)造器中初始化students屬性
?? ?public MapTest() {
?? ??? ?this.students = new HashMap<String, Student>();
?? ?}
?? ?// 添加
?? ?// 輸入學生ID,判斷是否被占用,若未被占用,則輸入姓名,創(chuàng)建新學生對象,并且添加到students中
?? ?public void testPut() {
?? ??? ?// 創(chuàng)建一個Scanner對象,用來獲取輸入的學生ID和姓名
?? ??? ?Scanner console = new Scanner(System.in);
?? ??? ?int i = 0;
?? ??? ?while (i < 3) {
?? ??? ??? ?System.out.println("請輸入學生ID:");
?? ??? ??? ?String ID = console.next();
?? ??? ??? ?// 判斷該ID是否被占用
?? ??? ??? ?Student st = students.get(ID);
?? ??? ??? ?if (st == null) {
?? ??? ??? ??? ?// 提示輸入學生姓名
?? ??? ??? ??? ?System.out.println("請輸入學生姓名:");
?? ??? ??? ??? ?String name = console.next();
?? ??? ??? ??? ?// 創(chuàng)建新的學生對象
?? ??? ??? ??? ?Student newStudent = new Student(ID, name);
?? ??? ??? ??? ?// 通過調(diào)用students的put方法,添加ID-學生映射
?? ??? ??? ??? ?students.put(ID, newStudent);
?? ??? ??? ??? ?System.out.println("成功添加學生:" + students.get(ID).name);
?? ??? ??? ??? ?i++;
?? ??? ??? ?} else {
?? ??? ??? ??? ?System.out.println("該學生ID已被占用!");
?? ??? ??? ??? ?continue;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?// 測試Map的keySet方法,返回的是所有鍵的集合
?? ?public void testKeySet() {
?? ??? ?// 通過keySet方法,返回Map中的所有“鍵”的Set集合
?? ??? ?Set<String> keySet = students.keySet();
?? ??? ?// 取得students的容量
?? ??? ?System.out.println("總共有:" + students.size() + "個學生!");
?? ??? ?// 遍歷keySet,取得每一個鍵,再調(diào)用get方法取得每個鍵對應的value
?? ??? ?for (String stuId : keySet) {
?? ??? ??? ?Student st = students.get(stuId);
?? ??? ??? ?if (st != null)
?? ??? ??? ??? ?System.out.println("學生:" + st.name);
?? ??? ?}
?? ?}
?? ?/*
?? ? * // 刪除Map中已有的映射 public void testRemove() { // 獲取從鍵盤輸入的待刪除學生ID字符串 Scanner
?? ? * console = new Scanner(System.in); while (true) { // 提示輸入待刪除的學生的ID
?? ? * System.out.println("請輸入要刪除的學生ID!"); String ID = console.next(); //
?? ? * 判斷該ID是否有對應的學生對象 Student st = students.get(ID); if (st == null) { //
?? ? * 提示輸入的ID并不存在 System.out.println("該ID不存在!"); continue; } students.remove(ID);
?? ? * System.out.println("成功刪除學生:" + st.name); break; } }
?? ? *
?? ? * // 通過entrySet方法來遍歷Map,返回的是所有鍵值對的集合 public void testEntrySet() { //
?? ? * Entry本身是帶有泛型的,跟定義Map時的泛型一樣 Set<Entry<String, Student>> entrySet =
?? ? * students.entrySet(); for (Entry<String, Student> entry : entrySet) {
?? ? * System.out.println("取得鍵:" + entry.getKey()); System.out.println("對應的值為:" +
?? ? * entry.getValue().name); } }
?? ? */
?? ?/*
?? ? * // 修改 // 利用put方法修改Map中的已有映射 public void testModify() { // 提示輸入要修改的學生ID
?? ? * System.out.println("請輸入要修改的學生ID:"); // 創(chuàng)建一個Scanner對象,去獲取從鍵盤上輸入的學生ID字符串
?? ? * Scanner console = new Scanner(System.in); while (true) { // 取得從鍵盤輸入的學生ID
?? ? * String stuID = console.next(); // 從students中查找該學生ID對應的學生對象 Student student =
?? ? * students.get(stuID); if (student == null) {
?? ? * System.out.println("該ID不存在!請重新輸入!"); continue; } // 提示當前對應的學生對象的姓名
?? ? * System.out.println("當前該學生ID,所對應的學生為:" + student.name); // 提示輸入新的學生姓名,來修改已有的映射
?? ? * System.out.println("請輸入新的學生姓名:"); String name = console.next(); Student
?? ? * newStudent = new Student(stuID, name); students.put(stuID, newStudent);
?? ? * System.out.println("修改成功!"); break; } }
?? ? */
?? ?//在Map中,用containsKey方法,來判斷是否包含某個Key值
?? ?//在Map中,用containsValue方法,來判斷是否包含某個Value值
?? ?public void testContainsKeyOrValue() {
?? ??? ?// 提示輸入學生id
?? ??? ?System.out.println("請輸入要查詢的學生id");
?? ??? ?Scanner console = new Scanner(System.in);
?? ??? ?String id = console.next();
?? ??? ?System.out.println("你輸入的學生id為:"+id+",在學生映射表中是否存在:"+students.containsKey(id));
?? ??? ?if(students.containsKey(id)) {
?? ??? ??? ?System.out.println("對應的學生為:"+students.get(id).name);
?? ??? ?
?? ??? ?//提示輸入學生姓名
?? ??? ??? ?System.out.println("請輸入要查詢的學生姓名");
?? ??? ??? ?String name = console.next();
?? ??? ??? ?if(students.containsValue(new Student(null,name))) {
?? ??? ??? ??? ?System.out.println("在學生映射表中,包含學生:"+name);
?? ??? ??? ?}else {
?? ??? ??? ?System.out.println("不存在該學生");?? ?
?? ??? ??? ?}
?? ??? ??? ?}
?? ?}
?? ?public static void main(String[] args) {
?? ??? ?MapTest mt = new MapTest();
?? ??? ?mt.testPut();
?? ??? ?mt.testKeySet();
?? ??? ?//mt.testRemove();
?? ??? ?//mt.testEntrySet();
?? ??? ?//mt.testModify();
?? ??? ?//mt.testEntrySet();
?? ??? ?
?? ??? ?mt.testContainsKeyOrValue();
?? ?}
}
2020-05-09
沒有的事,我把你代碼粘貼下來直接運行沒有錯誤。你仔細看看?