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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 zhangjinyu1991 于 2013-2-20 13:01 编辑

Map map=new HashMap<>();
Map sorted_map=new TreeMap(map);
TreeMap有以下构造函数:
public TreeMap();
public TreeMap(Comparator<? super K> comparator);
public TreeMap(Map<? extends K, ? extends V> m);
public TreeMap(SortedMap<K, ? extends V> m);
我就是不知道它用的是哪个?第三个吗,可是这样的话排序在哪里呢?就是在哪里完成了排序功能?

4 个回复

倒序浏览
首先Map<? extends K, ? extends V>作为参数传给TreeMap<K,V>,map中的key需要是TreeMap中的key的子类,value也一样;
其次,根据TreeMap的firstKey() (返回此映射中当前第一个(最低)键。 )方法,可以得知,在创建TreeMap对象的时候就已经排好序了。
回复 使用道具 举报
对TreeMap和TreeSet而言,排序都是在存入对象时根据你的存入对象的comparable方法来排序的。
回复 使用道具 举报
class Student
{
       
}
public class TreeSetTest {
   public static void main(String[] args)
   {
           Set<Student> set=new TreeSet<Student>();
       set.add(new Student());
       set.add(new Student());
   /*
    * java.lang.ClassCastException:com.keyee.test.heima.Student cannot be cast to java.lang.Comparable
    * 知道为什么会报错吗?就是因为排序是在这个存入对象阶段完成的。在存入第二个元素时,就会调用Student对象的comparable方法。
    * 结果它没有实现Comparable接口,JVM有点小失望,就报错了。
    */
   }
   
}
回复 使用道具 举报
哥们我给你讲:
首先,调用的肯定是public TreeMap(Map<? extends K, ? extends V> m)这个构造函数,因为你传入的参数是一个实现了Map接口的类,
而最后一个构造函数是SortedMap,SortedMap是Map的子接口,你的map只是实现了Map接口,并没有声明实现SortedMap接口,所以最后一个构造函数不能接收。
其次,你不知道如何排序的。看下面:
构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。插入此新映射的所有键都必须实现 Comparable 接口。
这句话是api关于public TreeMap(Map<? extends K, ? extends V> m)的介绍。
也就是说用了这个构造函数就不能传入Comparator比较器了,要使用自然顺序,因此你最开始放入map里面的元素,要实现Comparable接口。这样才能完成比较。

评分

参与人数 1黑马币 +12 收起 理由
张晋瑜 + 12 说得好,理解

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马