余生不过两万天1992 2016-01-14 14:32 采纳率: 0%
浏览 1426

KeySet跟entrySet为什么会有两种不同的结果。。

import java.util.*;

class Student implements Comparable
{
private String id;
private String name;
Student(String id,String name)
{
this.id = id;
this.name = name;
}
public String getId()
{
return id;
}
public String getName()
{
return name;
}
public String toString()
{
return id +"::" + name;
}
public int hashCode()
{
return this.id.hashCode() + this.name.hashCode()*30;
}
public boolean equals(Object obj)
{
if(obj instanceof Student)
throw new ClassCastException("类型不符合");

    Student s = (Student)obj;
    return this.name.equals(s.name) && this.id.equals(s.id);
}
public int compareTo(Student s)
{
    if(id.compareTo(s.id)==0)
        return this.name.compareTo(s.name);
    return this.id.compareTo(s.id);
}

}
class MyCmpt implements Comparator
{
public int compare(String o1,String o2)
{
return 1;
}
}
class MapDemo3
{
public static void demo()
{
TreeMap> czbk = new TreeMap>(new MyCmpt());

    List<Student> yure = new ArrayList<Student>();
    List<Student> jiuye = new ArrayList<Student>();

    czbk.put("yure",yure);
    czbk.put("jiuye",jiuye);

    yure.add(new Student("01","zhangsan"));
    yure.add(new Student("02","lisisan"));

    jiuye.add(new Student("01","zhangsansan"));
    jiuye.add(new Student("02","zhangxiaosan"));

    Set<Map.Entry<String,List<Student>>> e = czbk.entrySet();

    for(Iterator<Map.Entry<String,List<Student>>> it = e.iterator(); it.hasNext();)
    {
        Map.Entry<String,List<Student>> me = it.next();
        String st = me.getKey();
        List<Student> stu = me.getValue();
        System.out.println(st);
        getInfos(stu);
    }

    /*Set<String> s = czbk.keySet();
    for(Iterator<String> it = s.iterator();it.hasNext();)
    {
        String str = it.next();
        List<Student> stu = czbk.get(str);
        System.out.println(str);
        System.out.println(stu);
    }*/
}

public static void getInfos(List<Student> list)
{
    for(Iterator<Student> it = list.iterator();it.hasNext();)
    {
        Student s = it.next();
        System.out.println(s);
    }
}

public static void main(String[] args) 
{
    demo();
}

}
上面的代码我加入了比较器之后,用entrySet方法用迭代器去遍历键还是指向了值,但是我用keySet方法去遍历,键却指向了空,求解惑?

  • 写回答

3条回答

  • danielinbiti 2016-01-14 15:27
    关注

    问题在于

     czbk = new TreeMap>(new MyCmpt());//这里设置了比较器
     但你的MyCmpt定义只有一种返回值
     class MyCmpt implements Comparator
    {
    public int compare(String o1,String o2)
    {
    return 1;
    }
    也就是不管什么key值,都取右节点接着找,直到末尾,最终因为找不到,所以返回null。
    这里改成key值相等的时候就返回
    public int compare(Object o1,Object o2)
    {
    return ((String)o1).equals(o2)?0:1;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?