黑马程序员技术交流社区
标题:
关于比较器的问题
[打印本页]
作者:
陈莹
时间:
2012-9-2 13:11
标题:
关于比较器的问题
class MyComparator implements Comparator<Student>
{
public int compare(Student s1,Student s2)
{
System.out.println(s1.getName()+"与"+s2.getName()+"比较:");
int num = s1.getName().compareTo(s2.getName());
if(num==0)
{
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
}
return num;
}
}
public class MapTest2
{
public static void main(String args[])
{
TreeMap<Student,String> tm = new TreeMap<Student,String>(new MyComparator());
tm.put(new Student("张三",23),"北京");
tm.put(new Student("钱七",20),"天津");
tm.put(new Student("钱七",25),"天津");
tm.put(new Student("李四",21),"上海");
tm.put(new Student("阿里",25),"深圳");
tm.put(new Student("丁一",25),"深圳");
tm.put(new Student("张三",23),"北京");
Set<Map.Entry<Student,String>> entrymap= tm.entrySet();
Iterator<Map.Entry<Student,String>> it = entrymap.iterator();
while(it.hasNext())
{
Map.Entry<Student,String> me = it.next();
Student stu = me.getKey();
String address = me.getValue();
sop(stu+"--->"+address);
}
}
public static void sop(Object o)
{
System.out.println(o);
}
}
程序运行的结果是:
钱七与张三比较:
钱七与张三比较:
钱七与钱七比较:
李四与钱七比较:
李四与张三比较:
阿里与钱七比较:
阿里与钱七比较:
丁一与钱七比较:
丁一与张三比较:
张三与钱七比较:
张三与张三比较:
丁一 25--->深圳
张三 23--->北京
李四 21--->上海
钱七 20--->天津
钱七 25--->天津
阿里 25--->深圳
我的问题是:
为什么向TreeMap中添加数据时,不是跟每一个已经存在的数据进行比较,比如存入阿里,为什么阿里只跟钱七比较了,而没跟张三比较?这里面有什么规律吗?
作者:
牛杨
时间:
2012-9-2 13:23
这个问题我也曾经疑惑过。后来记得视频里面 毕老师说过, 因为在TreeMap里面底层比较的时候
采用了优化的比较方法
。
比如当元素比较多的时候TreeMap(底层数据结构是二叉树)并不一定从树根开始遍历比较了,有可能就从二叉树中间的某个结点开始遍历比较了。不管怎么比较,最后一定会保证元素是有序的。
当时我看这一天视频的时候,时间紧也没来得及深究这个问题。所以说这TreeMap里面到底采用的是什么优化的比较算法,我也不太清楚。我会持续关注你这个帖子,看看有没高手知道。
作者:
王德升
时间:
2012-9-2 14:08
tree.jpg
(80.87 KB, 下载次数: 14)
下载附件
tree
2012-9-2 14:03 上传
你可以看下这张图,这张图如果说 钱七是22,张三是20,那么阿里过来就直接跟22(钱七)比,就不会跟20(张三)比。
这是二叉树的内在实现的,不需要我们自己去实现,就跟List集合是可以重复的一样,因为它有索引而Set集合就不行,因为它没有索引,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2