A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*
要求:练习map集合的两种取出元素方式
思路;有两种:1,keySet:<1>运用Map集合的方法Set<K> keySet=t.keySet()将t集合中的Key取出并存在Set型集合中;
                        <2>通过迭代器取出Key
                        <3>通过Map中的Get(Object KeY)方法获取value值
              2,entrySet<1>通过Set<Map.Entry<K,V>>  entrySet=k.entrySet()获取映射关系的Set视图,而这个关系的类型就是Map.Entry
                            是map集合中的抽象内部类。叫键值对
                        <2>通过迭代器取出Set集合中的键值对既Map.Entry类的对象。
                        <3>通过Map.Entry类中的方法getKeY()h和getValue()来获取键和值
*/
import java.util.*;
class Student implements Comparable<Student>
{
    private String name;
    private int age;
    Student(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
    public int hashCode()//元素不确定要存在什么地方,如果要存入到hashSet里面要定义比较方法,所以要复写Comparable的方法比较爱年龄和姓名
    {
        return name.hashCode()+age*12;
    }
    public boolean equals(Object obj)
    {
        if(!(obj instanceof Student))
            throw new ClassCastException(" 类型不匹配");
        Student stu=(Student)obj;
        return this.name.equals(stu.name)&& this.age==stu.age;   
    }
    public int compareTo(Student s)//定义一个比较方法,以备有二叉树集合调用
    {
        int num=this.name.compareTo(s.name);
        if(num==0)
            return new Integer(this.age).compareTo(new Integer(s.age));
        return num;
    }
}
class Stucomparator implements Comparator<Student>
{
    public int compare(Student s1,Student s2)
    {
        int numb= s1.getName().compareTo (s2.getName());
        if(numb==0)
            return new Integer(s1.getAge()).compareTo (new Integer(s2.getAge()));
        return numb;
    }
}
class Maptest
{
        public static void main(String[] args)
        {
                HashMap<Student,String> ma=new HashMap<Student,String>();
                ma.put(new Student("lisi1",23),"henan");
                ma.put(new Student("lisi3",26),"nanjing");
                ma.put(new Student("lisi5",29),"beijing");
                Set<Student> keySet=ma.keySet();
                Iterator<Student> it=keySet.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next()+"...."+ma.get(it.next()));
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
To + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 习嘻嘻 于 2013-11-22 18:40 编辑

System.out.println(it.next()+"...."+ma.get(it.next()));
连续用,两个值是不一样的
你定义一个变量Student s=it.next()
System.out.println(s.getName()+"***"+s.getAge()+"...."+ma.get(s);
为什么要两种排序方法都实现了,Comparable和Comparator,用一种


评分

参与人数 1技术分 +1 收起 理由
To + 1

查看全部评分

回复 使用道具 举报
第71行有错识。 System.out.println(it.next()+"...."+ma.get(it.next()));

Iterator<Student> it = ma.keySet().iterator();
               
                while(it.hasNext())
                {
                        Student s = it.next();
                        System.out.println(s+"..."+ma.get(s));
                }

这是正确的写法。。
it.next()调用一次它就向下取一次的。。

评分

参与人数 1技术分 +1 收起 理由
To + 1

查看全部评分

回复 使用道具 举报
楼上说的很正确,我刚才也试了一下。调用 it.next(),向下取一次,拿着这个键获取值,而你输出语句中这两个是不能同时写的。
因为当e为空的时候,会发生异常。看下面就会明白
Entry<K,V> nextEntry() {
            Entry<K,V> e = next;
            if (e == null)
                throw new NoSuchElementException();
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
            next = successor(e);
            lastReturned = e;
            return e;
        }
回复 使用道具 举报
   Iterator<Student> it=keySet.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next()+"...."+ma.get(it.next()));
                }
it.next每被调用依次,指针就会自动向下移动依次,所以即使是同一句代码中出现的两次it.next所得结果也是不同的
楼主可以看看毕老师的25天基础视频第十四天讲的集合的内容
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马