请看下面的方法sortResults,里面有一个类型为treeset的局部变量,里面实现了comparator接口。我有一些疑问,请大家帮忙解答:
 1.为什么 sortedResults.add(new User(name,value))时会调用compare方法?是如何调用的?是不是每增加一个User,都要和sortedResults里面已经存在的User比较?
 2.在sortedResults里面new Comparator(),这种写法叫做什么?private static void sortResults(Map results) {
TreeSet sortedResults = new TreeSet(
new Comparator(){
public int compare(Object o1, Object o2) {
User user1 = (User)o1;
User user2 = (User)o2;
if(user1.value<user2.value)
{   
return -1;
}else if(user1.value>user2.value)
{
return 1;
}else
{   
return user1.name.compareTo(user2.name);
}
}
}
);
Iterator iterator = results.keySet().iterator();
while(iterator.hasNext())
{
String name = (String)iterator.next();
Integer value = (Integer)results.get(name);
if(value > 1)
{  
    sortedResults.add(new User(name,value));

}
}

printResults(sortedResults);
}

解决方案 »

  1.   

    在sortedResults里面new Comparator(),这种写法叫做 内部类~~~你可以google一下 就知道了……
      

  2.   

    我在compare方法里面打印了一句话,然后执行sortedResults.add(new User(name,value));
    我发现,当sortedResults大小为0时增加1个User,调用compare()0次;
            当sortedResults大小为1时增加1个User,调用compare()1次;
            当sortedResults大小为2时增加1个User,调用compare()1次;
            当sortedResults大小为3时增加1个User,调用compare()2次;没发现有啥规律啊?
        
      

  3.   

     1.为什么 sortedResults.add(new User(name,value))时会调用compare方法?是如何调用的?是不是每增加一个User,都要和sortedResults里面已经存在的User比较?
     2.在sortedResults里面new Comparator(),这种写法叫做什么?1:这个是集合里面的定义的,只要重写了这个compare方法,集合里面的元素就会以这个规则自动排列,这个是java自动调用的,如果要问原理,只有看JDK源代码了。2:这个是TreeSet的一个构造方法,按照你给定的Comparator进行排序,你这里用到了匿名类实现了Comparator接口
      

  4.   

    TreeSet维护的TreeMap对象的键值(key)来管理set里面的值
    要想知道怎么调用的comparator看下源码很容易明白
    下面是TreeMap的put方法,也就是在TreeSet里面add方法调用的 public V put(K key, V value) {
            Entry<K,V> t = root;
            if (t == null) {
        // TBD:
        // 5045147: (coll) Adding null to an empty TreeSet should
        // throw NullPointerException
        //
        // compare(key, key); // type check
                root = new Entry<K,V>(key, value, null);
                size = 1;
                modCount++;
                return null;
            }
            int cmp;
            Entry<K,V> parent;
            // split comparator and comparable paths
            Comparator<? super K> cpr = comparator;//这里的comparator是构造函数传进来的对象
            if (cpr != null) {
                do {
                    parent = t;
                    cmp = cpr.compare(key, t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
            }
            else {
                if (key == null)
                    throw new NullPointerException();
                Comparable<? super K> k = (Comparable<? super K>) key;
                do {
                    parent = t;
                    cmp = k.compareTo(t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
            }
            Entry<K,V> e = new Entry<K,V>(key, value, parent);
            if (cmp < 0)
                parent.left = e;
            else
                parent.right = e;
            fixAfterInsertion(e);
            size++;
            modCount++;
            return null;
        }