本帖最后由 李小然 于 2014-6-2 00:46 编辑
在treeset集合中,如果集合自身具有了比较器,而集合中的对象也实现了comparable接口,具有了比较性,那么这个程序中,到底是参考哪个呢
在TreeSet集合中,如果对象类实现了comparable接口,是可以实现TreeSet的“指定顺序”排序。
但是在开发中,添加的对象类,很可能不是由我们书写,我们无法更改;
或者对象类中所实现的排序方法我们不适用
这样就需要我们让集合自身来可以排序(实现Comparator,重写compare方法)。
这样可以清晰的明确,排序方法优先级:
如果集合自身无比较性,按照集合对象类中的方法排序。
如果集合自身有比较性,优先按照集合自身的比较性排序。
代码举例:
/**
需求:实现TreeSet 自定义排序两种并存,查看当两种方式并存时,按照哪种方式排序。
@author 李小然
*/
import java.util.Iterator;
import java.util.TreeSet;
import java.util.Comparator;
class Person
{
private String name;
private int age;
public Person(String _name, int _age)
{
this.name = _name;
this.age = _age;
}
//按照年龄排序
public int compareTo(Object obj)
{
Person p = (Person)obj;
return this.getAge()-p.getAge();
}
public void setName(String _name)
{
this.name = _name;
}
public String getName()
{
return name;
}
public void setAge(int _age)
{
this.age = _age;
}
public int getAge()
{
return age;
}
}
class CompareToByNameAndAge implements Comparator
{
//按照名字顺序排序
@Override
public int compare(Object o1, Object o2)
{
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return (p1.getName()).compareTo(p2.getName());
}
}
public class TreeSetBothMethod
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new CompareToByNameAndAge());
ts.add(new Person("zhangsan", 20) );
ts.add(new Person("lisi", 21) );
ts.add(new Person("wangwu", 19) );
ts.add(new Person("zhaoqi", 30) );
ts.add(new Person("gaoba", 25) );
Iterator it = ts.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
System.out.println("name: " + p.getName() +
" age: " + p.getAge());
}
}
}
最后的结果是按照名字的字母顺序排序的,验证完毕。
|