黑马程序员技术交流社区
标题:
关于TreeSet集合排序的问题求解?
[打印本页]
作者:
希望的曙光
时间:
2013-1-17 12:32
标题:
关于TreeSet集合排序的问题求解?
TreeSet集合第一种排序方式:让元素实现Comparable接口,并覆盖其中的compareTo方法,使元素自身具备比较性。
TreeSet集合第二种排序方式:定义一个比较器,实现Comparator接口,并覆盖其中的compare方法。再将定义的比较器对象作为参数传递给TreeSet集合的构造函数。
这两种排序方式有什么不同?哪一种排序方式更好?另外,Set集合是无序的,能不能通过排序让Set集合实现元素的存入顺序与取出顺序一致?
作者:
黄锦成
时间:
2013-1-17 12:55
一个是让元素自己有比较性;一个是让集合有比较性。推荐使用Comparator。
想要存入和取出的顺序一致可以使用LinkedHashSet
作者:
希望的曙光
时间:
2013-1-17 15:51
那Set集合的排序问题那
作者:
张敬培
时间:
2013-1-17 16:31
第一种是在定义元素的时候就让元素重写了Comparable借口的compareTo方法,
第二种在定义集合的时候重写Comparator接口的compare方法,
区别是:有些类已经实现了compareTo方法,但是这些类的compareTo方法我们不满意所以就需要重写这个类的方法
举例:String类已经实现compareTo方法,实现了字符串按从a--z的排序,现在我们想要字符串按从z--a的排序,这时候第一种就无法实现我们的要求,使用第二种,在定义集合的时候重写Comparator接口的compare方法,来实现我们的要求。
一般建议使用第二种,从上面的例子中可以看到第二种的好处,可以根据要求随时改变集合中元素的排列顺序
在你往集合中存放元素的时候,就已经把你存入的数据进行了排序,所以你取出的数据都是已经排序后的数据,不可能与你存入时的数据顺序相同。
作者:
王溢君
时间:
2013-1-17 23:49
毕老师视频里不是说的很清楚吗?另外存入相同的话,重写的方法里返回1,就可以实现。
作者:
王溢君
时间:
2013-1-18 20:44
第一个问题楼上几位的回答我想你已经清楚了,那我来回答你这个问题,
Set集合是无序的,能不能通过排序让Set集合实现元素的存入顺序与取出顺序一致?
只要我们重写了TreeSet的compareTo方法,就可以实现。
我们知道TreeSet存入方式是以二叉树的形式,调用底层的compareTo方法,当返回1时大于,0相等,-1小于。
我们知道取出的时候他是按照从小到大取出的,那我们自定义比较方法,让后面存入的数总是大于前面存入的数,就可以了。
也就是说compareTo方法里总是return 1;
import java.util.*;
class TreeSet3
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Demo("abcd"));
ts.add(new Demo("cc"));
ts.add(new Demo("cba"));
ts.add(new Demo("z"));
ts.add(new Demo("z,,,"));
ts.add(new Demo("hahaha"));
//这里随便改顺序,后面就按什么顺序输出。
Iterator it = ts.iterator();
while (it.hasNext())
{
Demo d = (Demo)it.next();
System.out.println("d:"+d.getName());
}
}
}
class Demo implements Comparable//该接口强制让对象具备比较性
{
private String name;
Demo(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public int compareTo(Object obj)
{
return 1;//返回1,大于, 关键点!!!
//改为-1,就是反顺序输出
}
}
复制代码
作者:
王溢君
时间:
2013-1-18 20:57
给你一个更简单的,用比较器法写的。
import java.util.*;
class TreeSet3
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new StrLenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("z");
ts.add("hahaha");
Iterator it = ts.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}
}
}
class StrLenComparator implements Comparator
{
public int compare(Object o1,Object o2)
{
return 1;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2