黑马程序员技术交流社区
标题:
求细心人解答,感激涕零,想了一天了。运行结果和想象中差别太大
[打印本页]
作者:
潜伏
时间:
2013-11-22 17:55
标题:
求细心人解答,感激涕零,想了一天了。运行结果和想象中差别太大
/*
要求:练习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()));
}
}
}
作者:
习嘻嘻
时间:
2013-11-22 18:22
本帖最后由 习嘻嘻 于 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,用一种
作者:
汪洋大海
时间:
2013-11-22 18:31
第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()调用一次它就向下取一次的。。
作者:
帅气的冬瓜
时间:
2013-11-22 19:34
楼上说的很正确,我刚才也试了一下。调用 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;
}
作者:
aion2013tian
时间:
2013-11-22 20:47
Iterator<Student> it=keySet.iterator();
while(it.hasNext())
{
System.out.println(it.next()+"...."+ma.get(it.next()));
}
it.next每被调用依次,指针就会自动向下移动依次,所以即使是同一句代码中出现的两次it.next所得结果也是不同的
楼主可以看看毕老师的25天基础视频第十四天讲的集合的内容
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2