问答详情
源自:6-4 学生选课---判断 Map 中是否包含指定的 key 和 value

同样的问题,为什么我写的equals和hashcode方法还是返回false?

同样的问题,为什么我写的equals和hashcode方法还是返回false?

提问者:东方的小王 2017-04-18 11:09

个回答

  • define_ray
    2017-08-27 18:06:38

    http://img.mukewang.com/59a2999300014eec10900490.jpg

    错误如上图。

  • 东方的小王
    2017-04-22 10:28:29

    public class Maptest {

    Scanner input = new Scanner(System.in);

    //private static final String ID = null;

    private Map<String,Student> Students;

    public Maptest(){

    this.Students=new HashMap<String,Student>();

    }

    public void testPut(){

    Scanner input=new Scanner(System.in);

    int i=1;

    while(i<=3){//3个学生

    System.out.print("请输入第"+i+"学生ID:");

    String ID=input.next();

    Student st = Students.get(ID);//保存id,判断id是否被占用

    if(st==null){//如果当前id为空

    System.out.print("请输入学生姓名:");

    String name=input.next();

    Student stu=new Student();//保存学生信息,set保存信息

    stu.set(ID,name);

    Students.put(ID,stu);//通过put,添加id学生映射,保存id 

    System.out.println("添加学生:"+Students.get(ID).name);

    i++;//i加1

    }else{//否则

    System.out.println("id已存在");

    continue;//继续循环

    }

    }

    }

    public void testKeySet(){ //打印出所有学生

    Set<String>keySet=Students.keySet();//通过KeySet方法,返回Map中的所有"键"的Set集合

    //取得Students容量

    System.out.println("总共有"+Students.size()+"名学生");//size返回

    for(String stuid:keySet){//学生id

              Student st=Students.get(stuid);

              if(st!=null)//st如果不为空

              System.out.println("学生:"+st.id+":"+st.name);

              }

     }

    //删除学生

    public void romoveStu(){

    Scanner input=new Scanner(System.in);

    System.out.println("请输入要删除学生的数量:");

    int a=input.nextInt();

    while(true){

    for(int i=1;i<=a;i++){

    if(a>Students.size()){

    System.out.println("数量大于学生总量!!!");

    continue;

    }else if(a==0){

    break;

    }else{

    }

    System.out.print("请输入要删除的第"+i+"位学生ID:");

    String ID=input.next();

    Student st=(Student)Students.get(ID);

                      if(st==null){ 

    System.out.println("id不存在");

    continue;

    }

    Students.remove(ID);

    System.out.println("成功删除学生:"+st.name);

    }

    break;

    }

    }

    //通过entrySet方法来遍历Map

    public void testentrySet(){//输出被删除后剩余的学生

    Set<Entry<String,Student>>entrySet=Students.entrySet();

    for (Entry<String, Student> entry : entrySet) {

    System.out.println("剩余学生id:"+entry.getKey());//对应的id

    System.out.println("学生姓名:"+entry.getValue().name);//对应的值

    }


    }

    //修改学生内容

    public void testModifly(){

    System.out.println("请输入要修改的学生id:");

    Scanner input = new Scanner(System.in);

    while(true){

    String stuId = input.next();

    Student st=Students.get(stuId);//保存当前id

    if(st==null){

    System.out.println("id不存在");

    continue;

    }else{

    System.out.println("当前ID所对应的学生:"+st.name);

    System.out.println("请输入新的学生姓名:");

    String name=input.next();

    String id;

    Student newStu=new Student();//重新保存信息

    newStu.set(stuId,name);

    Students.put(stuId,newStu);//属性.put(信息变量名,对象名)

    System.out.println("修改成功!:");

    System.out.println("修改后的学生:");

    testKeySet();

    break;

    }


    }

    }

    //测试map中是否包含某个key值或value值

    public void testContainsKeyOrVaule(){

    System.out.print("请输入要查询的学生id:");

    String id=input.next();

    System.out.println("您输入的学生:"+id+","+"是否存在:"+Students.containsKey(id));

    if(Students.containsKey(id)){

        System.out.println("学生姓名:"+Students.get(id).name); //输出和id对应的姓名

    }

    }

    //containsValue方法判断学生是否存在

    public void testContainsKeyOrVaule1(){

    System.out.println("请输入学生姓名:");

    String name=input.next();

    if(Students.containsValue(name)){

    System.out.println("包含学生"+name+"对应的id"+Students.get(name).id);

    }else{

    System.out.println("不包含");

    }

    }

    public static void main(String[] args) {

    Maptest p=new Maptest();

    p.testPut();

    p.testKeySet();

    p.romoveStu();

    p.testentrySet();

    p.testKeySet();//删除学生后在调用所有学生的方法是删除学生后的学生

    //p.testModifly();//修改学生

    p.testContainsKeyOrVaule();

    p.testContainsKeyOrVaule1();

    }

    }


  • 东方的小王
    2017-04-19 12:49:53

    public class Student {

    String id;//学生

    String name;

    static Set <Class>cla;//学生所选的课程信息属性

    public  Student(String id,String name){//将最终的值赋给构造方法

    this.name = name;

    this.id=id;

    this.cla=new HashSet<Class>();

    }

    @Override

    public int hashCode() {

    final int prime = 31;

    int result = 1;

    result = prime * result + ((id == null) ? 0 : id.hashCode());

    result = prime * result + ((name == null) ? 0 : name.hashCode());

    return result;

    }

    @Override

    public boolean equals(Object obj) {

    if (this == obj)

    return true;

    if (obj == null)

    return false;

    if (!(obj instanceof Student))

    return false;

    Student other = (Student) obj;

    if (id == null) {

    if (other.id != null)

    return false;

    } else if (!id.equals(other.id))

    return false;

    if (name == null) {

    if (other.name != null)

    return false;

    } else if (!name.equals(other.name))

    return false;

    return true;

    }

    }


  • 星鸿
    2017-04-18 14:22:07

    首先,你得把代码贴出来