请看下面的方法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.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);
}
我发现,当sortedResults大小为0时增加1个User,调用compare()0次;
当sortedResults大小为1时增加1个User,调用compare()1次;
当sortedResults大小为2时增加1个User,调用compare()1次;
当sortedResults大小为3时增加1个User,调用compare()2次;没发现有啥规律啊?
2.在sortedResults里面new Comparator(),这种写法叫做什么?1:这个是集合里面的定义的,只要重写了这个compare方法,集合里面的元素就会以这个规则自动排列,这个是java自动调用的,如果要问原理,只有看JDK源代码了。2:这个是TreeSet的一个构造方法,按照你给定的Comparator进行排序,你这里用到了匿名类实现了Comparator接口
要想知道怎么调用的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;
}