关于比较器的调用方法

yiruanban 2014-04-30 09:02:49
比较器只是在TreeSet中创建了一个对象并没有调用MyComparator中的Compare方法呀!传进TreeSet中的元素怎么比较的呢???(这时基于本人对对象的创建内存图解上理解,不明白为什么,MyComparator里面的Compare方法不调用的话不会进栈的呀!!!)
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class ComparatorDemo {

public static void main(String[] args) {
TreeSet set=new TreeSet(new MyComparator());
set.add("aw");
set.add("dsui");
set.add("ewib");
set.add("9320");
set.add("aw");
set.add("dsui");
for(Iterator it=set.iterator();it.hasNext();){
System.out.println(it.next());
}
}

}
//创建一个比较器
class MyComparator implements Comparator{

@Override
public int compare(Object o1, Object o2) {
//先按照字符串的长度进行比较,如果长度相同,再按照字符串的字典顺序进行比较
if(o1==null||o2==null){
throw new NullPointerException("对不起,请传两个对象");
}
//如果不为空,则判断是不是String对象
if(!(o1 instanceof String) || !(o2 instanceof String)){
throw new ClassCastException("类型错误");
}
String s1=(String)o1;
String s2=(String)o2;
int temp=s1.length()-s2.length();
return temp==0?s1.compareTo(s2):temp;
}

}
...全文
212 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leon_He2014 2014-05-04
  • 打赏
  • 举报
回复

package temp;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class MainClass {
	public static void main(String[] args) throws Exception {
		TreeSet set=new TreeSet(new MyComparator());
		set.add("aw");
		set.add("dsui");
		set.add("ewib");
		set.add("9320");
		set.add("aw");
		set.add("dsui");
		for(Iterator it=set.iterator();it.hasNext();){
			System.out.println(it.next());
		}
	}
}

//创建一个比较器
class MyComparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		//先按照字符串的长度进行比较,如果长度相同,再按照字符串的字典顺序进行比较
		if(o1==null||o2==null){
			throw new NullPointerException("对不起,请传两个对象");
		}
		//如果不为空,则判断是不是String对象
		if(!(o1 instanceof String) || !(o2 instanceof String)){
			throw new ClassCastException("类型错误");
		}
		String s1=(String)o1;
		String s2=(String)o2;
		int temp=s1.length()-s2.length();
		
		System.out.println("MyComparator "+o1.toString()+"  "+o2.toString());
		return temp==0?s1.compareTo(s2):temp;
	}
	
}

调用了呀,结果也是按照长度排序的
yuhouqingchen_2648 2014-05-04
  • 打赏
  • 举报
回复
add的时候会调用compare方法,可以看看jdk源码
Z-ero 2014-05-01
  • 打赏
  • 举报
回复
在给集合增加新元素的时候,底层会调用比较器对新增的元素与已经存在的元素进行比较,而不是手工调用的
byourfan 2014-04-30
  • 打赏
  • 举报
回复
在add的时候就使用比较器插入到正确的位置

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧