黑马程序员技术交流社区
标题:
TreeSet中实现排序的问题
[打印本页]
作者:
明天,你好
时间:
2013-5-13 22:00
标题:
TreeSet中实现排序的问题
本帖最后由 刘胜寒 于 2013-5-18 03:30 编辑
public class CompareByAge implements Comparator{
public int compare(Object o1, Object o2) {
Person p1=(Person)o1;
Person p2=(Person)o2;
if(p1.getAge()>p2.getAge())
return 1;
else if(p1.getAge()<p2.getAge())
return -1;
else{
return p1.getAge()-p2.getAge();
}
}
}
在主方法中调用这个方法,可以返回是按年龄大小排序,求高手解释是怎么实现的
作者:
花开花落总相似
时间:
2013-5-13 22:08
本帖最后由 花开花落总相似 于 2013-5-13 22:16 编辑
是要解释这个方法还是什么? 是解释方法的话 就是这样了
public class CompareByAge implements Comparator{ //自定义一个比较方法 要想比较就需要有该对象有比较性 所以要继承这个 方法上面可以加泛型
public int compare(Object o1, Object o2) { // 覆写compare方法
Person p1=(Person)o1; //如果不加泛型 这里建议判断一下类型
Person p2=(Person)o2;
if(p1.getAge()>p2.getAge()) //这里就没什么好说的了 这个就是比较的书写
return 1; //其中这里返回值 为 1 下面的 -1 是排序中按照返回值的正负来判断的 还有0
else if(p1.getAge()<p2.getAge())
return -1;
else{
return p1.getAge()-p2.getAge();
}
}
}
作者:
明天,你好
时间:
2013-5-13 22:15
解释这个底层实现,大体的流程我也知道
作者:
张金铎
时间:
2013-5-13 22:20
TreeSet排序的第一种方式:
让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
步骤:定义一个类,实现Compartor()接口,覆盖compare方法。把类对象作为初始值传给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。(自几写的比较器为主,元素自带compareTo方法为次)
复制代码
代码示例如下:
import java.util.*;
class TreeSetTest
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet(new MyCompare());
//ts.add(new Person("a"));
ts.add(new Person("ab"));
ts.add(new Person("ac"));
ts.add(new Person("bbcd"));
ts.add(new Person("abcd"));
ts.add(new Person("adcde"));
ts.add(new Person("acdef"));
for(Iterator it=ts.iterator();it.hasNext();)
{System.out.println(it.next());}
}
}
class Person
{
private String name;
Person(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public String toString(){
return name;}
}
class MyCompare implements Comparator
{
public int compare(Object obj1,Object obj2){
if(!(obj1 instanceof Person)&&(obj1 instanceof Person))
throw new RuntimeException("不是学生对象");
Person p1=(Person ) obj1;
Person p2=(Person ) obj2;
int num=new Integer(p1.getName().length()).compareTo(new Integer(p2.getName().length()));
if(num ==0){
return p1.getName().compareTo(p2.getName());
}
return num;
}
复制代码
作者:
花开花落总相似
时间:
2013-5-13 22:22
本帖最后由 花开花落总相似 于 2013-5-13 22:25 编辑
明天,你好 发表于 2013-5-13 22:15
解释这个底层实现,大体的流程我也知道
TreeSet是一个有序集合,里面的元素若要实现自然排序就需要实现Comparable接口,或者你也可以自定义一个Comparator实现自己的比较方式。TreeSet底层无非是通过比较元素实现排序,那也是调用Comparable或者Comparator来实现的。 其实你可以在覆写的 他的比较方法时候加一个比较方法的输出语句 试试看
如
import java.util.*;
public class TestTreeObject{
public static void main(String[]args){
TreeSet <String> ts = new TreeSet <String> (new bijiao());
ts.add("adfgewgsa");
ts.add("adfgewsdsgsa");
ts.add("adfgesdfewwgsa");
ts.add("adfgewsdfgsa");
ts.add("adfgesdafewrwgsa");
//ts.add(4546);
Iterator it = ts.iterator();
while(it.hasNext()){
output(it.next());
}
}
public static void output(Object obj){
System.out.println(obj);
}
}
class bijiao implements Comparator{
public int compare(Object obj1,Object obj2){
String s1 = (String)obj1;
String s2 = (String)obj2;
System.out.println("显示"); //这里加个输出语句 你可以看到TreeSet 集合在排序是调用该方法的时候
return s1.length()-s2.length();
}
}
作者:
刘胜寒
时间:
2013-5-14 13:33
如果问题解决,及时结贴。。把未解决变成以解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2