黑马程序员技术交流社区
标题:
TreeSet里CompareTo方法疑问!!!
[打印本页]
作者:
赵家阳
时间:
2012-12-3 18:25
标题:
TreeSet里CompareTo方法疑问!!!
本帖最后由 赵家阳 于 2012-12-6 16:47 编辑
import java.util.*;
public class TreeSetDemo {
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
Student st1 = new Student("wangwu001",21);
Student st2 = new Student("langwu001",21);
Student st3 = new Student("wangwu001",20);
Student st4 = new Student("wangwu001",22);
ts.add(st1);
ts.add(st2);
ts.add(st3);
ts.add(st4);
/*
ts.add(new Student("lisi01",18));
ts.add(new Student("lisi02",29));
ts.add(new Student("lisd01",21));
ts.add(new Student("misi01",18));
ts.add(new Student("lssi01",19));
*/
Iterator it = ts.iterator();
while(it.hasNext())
{
Student st = (Student)it.next();
System.out.println(st.getName()+"======"+st.getAge());
}
}
}
class Student implements Comparable
{
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 compareTo(Object obj)
{
if(!(obj instanceof Student))
{
throw new RuntimeException("不是学生对象");
}
Student st = (Student)obj;
System.out.println(st.getName()+",......,.."+st.getAge());
if(this.age >st.age)
{
return 1;
}
if(this.age == st.age)
{
return this.name.compareTo(st.getName());
}
return -1;
}
}
复制代码
疑问:
在上面两种创建对象的方式结果都是正确的,
但是,在此处:public int compareTo(Object obj) 其中的obj并没有明确指定是哪个对象,CompareTo方法底层是怎么实现在
比较的过程中能与各个对象进行比较呢?
求精讲!!!!
作者:
轻松过关
时间:
2012-12-3 19:22
public int compareTo(T o);这是接口的源代码,里面什么都没写就是一个抽象方法。
如果你的eclips关联了源代码,你可以选中类名按F3来查找java源代码
作者:
轻松过关
时间:
2012-12-3 20:01
TreeSet底层是TreeMap实现的,下面的代码是TreeMap中的put代码?
里面可以看出在你装入数据的是i和它调用了compare方法来比较你装入的数据
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // 里面没有值的时候本身和本身比较
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = 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;
// 新对象调用自己compareTo和之前值进行比较。所以你说的compareTo(Object obj)中的obj是之前存储过的值。具体是哪个应该是你存的数据数据规则决定的。从小到大,那就是之前存储最大的那个。
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<>(key, value, parent);
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
size++;
modCount++;
return null;
}
作者:
赵家阳
时间:
2012-12-3 22:52
轻松过关 发表于 2012-12-3 20:01
TreeSet底层是TreeMap实现的,下面的代码是TreeMap中的put代码?
里面可以看出在你装入数据的是i和它调用了 ...
不好意思,这点还没有学到,暂时不能做回答! 不过还是谢谢了!
作者:
轻松过关
时间:
2012-12-4 02:50
抱歉那应该不是问号,我找出来的底层代码!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2