JAVA-Comparable接口

TreeSet实现类中的元素是无序的,但是可以按照一定的顺序遍历,当我们自定义一个类,就需要用Comparable接口或者Comparator接口覆写其中的方法来实现元素之间的比较排序。

用Person类为例(需要覆写hashCode()和equals()方法)

**

1.Comparable接口

**
第一步,Person类implements接口
第二步,在Person类中覆写compareTo()方法

//在Person类中覆写
@Override
	public int compareTo(Object o) {
		if(o instanceof Person){
			Person person=(Person)o;
			//return this.age-person.age;
			// int型对象没有方法,所以只能返回运算;如果Integer age,可以用return this.age.compareTo(person.age)
			int i=this.age.compareTo(person.age);
			if(i==0){
				return this.name.compareTo(person.name);
			}else
				return i;
		}
		return 0;
	}

2.Comparator接口

(1)内部类写法

public class TreeSetTest {

	@Test
	public void test() {
		Comparator com=new Comparator(){
			@Override
			public int compare(Object o1, Object o2) {
				if(o1 instanceof Person && o2 instanceof Person){
					Person person1=(Person)o1;
					Person person2=(Person)o2;
					int i=person1.getAge().compareTo(person2.getAge());
					if(i==0){
						return person1.getName().compareTo(person2.getName());
					}else
						return i;
				}
				return 0;
			}
		};
		
		Set set=new TreeSet(com);
		set.add(new Person("张三",18));
		set.add(new Person("李四",15));
		set.add(new Person("王五",20));
		set.add(new Person("王六",20));
		set.add(new Person("朱六",19));
		set.add(new Person("赵钱",23));
		
		Iterator iterator=set.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}
}

**(2)外部类写法**

自定义一个MyComparator类implements Comparator

class MyComparator implements Comparator{
	@Override
	public int compare(Object o1, Object o2) {
		if(o1 instanceof Person && o2 instanceof Person){
			Person person1=(Person)o1;
			Person person2=(Person)o2;
			int i=person1.getAge().compareTo(person2.getAge());
			if(i==0){
				return person1.getName().compareTo(person2.getName());
			}else
				return i;
		}
		return 0;
	}
}
public class TreeSetTest {

	@Test
	public void test() {
		MyComparator mcom=new MyComparator();
		Set set=new TreeSet(mcom);
		set.add(new Person("张三",18));
		set.add(new Person("李四",15));
		set.add(new Person("王五",20));
		set.add(new Person("王六",20));
		set.add(new Person("朱六",19));
		set.add(new Person("赵钱",23));
		
		Iterator iterator=set.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}
}

两种方法的主要区别: Comparale接口是在集合的元素类中(如Person类)实现的,需要覆写compareTo( )方法 Comparator接口是在TreeSet集合对象中或者自定义的比较器中使用,需要覆写compare方法;并且还要创建Comparator对象,并把此对象传递给TreeSet中

*以上为个人拙见,如有意见或建议,欢迎读者指出*

你可能感兴趣的:(Java,java,集合类)