2 qq 27604401 qq_27604401 于 2016.01.14 22:32 提问

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方法去遍历,键却指向了空,求解惑?

4个回答

CSDNXIAON
CSDNXIAON   2016.01.14 22:35

entrySet与keySet的不同用法
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

danielinbiti
danielinbiti   Ds   Rxr 2016.01.14 23: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;
}
jia20003
jia20003   2016.01.14 23:29

你用的是Set集合,哪里有Key,你的Set是存储了很多个Map

你当然用EntrySet才能迭代取出,对取得的Map对象再keyset才正确

你可能是刚学,代码是copy来的/? 还是自己写的/?

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.01.17 13:29

首先,你这段代码还存在语法错误,子类Student实现了Comparable接口了,却没有实现compareTo(Object)方法,我拷贝代码后编译器报错了。
子类重新或者实现接口方法 ,不能修改原来方法的声明的,你虽然也提供了compareTo(Student)但是不是父类声明的方法,所以编译器报错了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java中map集合的两种取出方式keySet和entrySet
package day03; import java.util.*; class MapDemo { public static void main(String[] args) { Map map=new HashMap(); map.put("01","zhangsan01"); map.put("02","zhangsan02"); map.put("03","zhangsan
Map遍历的keySet()和entrySet()性能差异原因
map的遍历一般是通过entrySet()和keySet()来遍历。在性能上entrySet()会优于keySet()。这是为什么呢?Set<Entry<String, String>>entrySet = map.entrySet(); Set<String> set = map.keySet();` 原因在于: public V get(Object key) { if (key
entrySet和keySet之比较
看到一篇写EntrySet和keySet比较的文章(http://ylsuccess.iteye.com/blog/406068),自己动手做了以下实验。 发现entrySet确实比keySet快,特别是在数据量比较少的时候优势很明显。以后迭代就多用entrySet了。 import java.util.Calendar; import java.util.Date; import j
HashMap的keySet遍历和entrySet遍历时间效率比较
HashMap的keySet遍历和entrySet遍历时间效率比较
HashMap遍历使用entrySet的效率真的比keyset高?
HashMap是一个比较常用的映射。当我们遍历的时候会怎样写呢? 我一开始时这样写的: for (String s : map.keySet()){ map.get(s); } 当然,如果不要key也可以这样写: for (Object result: map.values()) { if (result != null){
keySet和entrySet速度区别
1、keySet()的速度比entrySet()慢了很多,也就是keySet方式遍历Map的性能不如entrySet性能好为了提高性能,以后多考虑用entrySet()方式来进行遍历。对于keySet来讲,他便利了两次,一次转为Iterator类型,一次成HashMap中取出key对应的value值,二entrySet只遍历了一次,他将key和value全部放入entry中。       2、k
Map集合中value()、keySet()和entrySet()以及性能的分析
在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, KeySet():将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取key entrySet():Set> entrySet() //返回此映射中包含的映射关系的 S
java基础--关于map的遍历keySet和entrySet
public static void main(String[] args) {         // TODO Auto-generated method stub         Map maps = new HashMap();         maps.put("111", "111a");         maps.put("222", "222b");         map
Java 遍历Map的2种方法(KeySet、EntrySet)
(1)在需要同时获取Map的<Key, Value>时,EntrySet<KeyType, VlaueType>比KeySet<KeyType>方法要快很多。 (2)如果只需要获取Map的Key,建议使用KeySet<KeyType>方法,因为不需要像EntrySet<KeyType, VlaueType>一样开辟额外的空间存储value值。 (3)如果只需要获取Map的Value,建议使用map.values()方法获取values的集合(Collection)。 (4)由于操作系统内存管理的置换算法(L
高效编程之HashMap的entryset和keyset比较
最近看了一点spring的源码,甚是苦涩;对spring稍微有了点整体的认识,但对很多细节的地方还是懵逼啊。。。太多不懂了的,只能慢慢去读,先把简单的不懂的解决; 比如beanfactory通过扫描器拿到了注解标记的那些类,都是放到一个hashmap中,然后文件名就是key,文件就是value;首先都会有一个 "map".entryset的操作;再往下面走的,这个entryset方法我不