JAVA提高教程(4)-认识Set集合之TreeSet
时间:2011-04-07 csdn 老紫竹
TreeSet 是用来进行集合排序的,请注意他和LinkedHashSet的区别。
TreeSet是按照一定的规则,将加入到集合里面的数据进行排序,而LinkedHashSet是 严格按照你放入集合的顺序进行使用。
先看源代码
package collection.lession4;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
/**
* 老紫竹JAVA提高教程(4)-认识Set集合之TreeSet。<br>
* 此实现的特点是里面的数据会自然排序或者用指定的排序类排序。
*
* @author 老紫竹 JAVA世纪网(java2000.net)
*
*/
public class Lession4 {
public static void main(String[] args) {
// 测试自然排序
testNature();
// 测试指定排序方式
testComparator();
// 测试特殊的混合对象排序
testMix();
}
public static void testNature() {
// 测试一下数字
TreeSet<Integer> set = new TreeSet<Integer>();
// 反向存入整数数据
for (int i = 10; i >= 1; i--) {
set.add(i);
}
// 输出看看
// 可以看到数据为自然的数字排序
showSet(set); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 测试一下字符串
TreeSet<String> set2 = new TreeSet<String>();
// 同样反向放入
for (int i = 10; i >= 1; i--) {
set2.add(i + "");
}
// 看输出结果
// 10 的自然排序没有2高,因为字符''1''小于''2''
showSet(set2); // [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
// TreeSet里面的数据因为要排队
// 所以如果是混合类型数据的数据,如果不能字段转换
// 将出现异常 java.lang.ClassCastException:
}
public static void testComparator() {
// 同样测试数字,我们要反向排序
TreeSet<Integer> set = new TreeSet<Integer>(new MyIntegerComparator());
// 反向存入整数数据
for (int i = 10; i >= 1; i--) {
set.add(i);
}
// 输出看看
// 可以看到数据为我们期望的反向排序了
showSet(set); // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
// 我们指定更奇怪的排序,奇数在前面,偶数在后面
// 我们使用匿名内部类
TreeSet<Integer> set2 = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 % 2 != 0) {
if (o2 % 2 != 0) {
return o2.compareTo(o1);
}
return -1;
}
if (o2 % 2 != 0) {
return 1;
}
return o2.compareTo(o1);
}
});
// 反向存入整数数据
for (int i = 10; i >= 1; i--) {
set2.add(i);
}
// 输出看看
// 可以看到数据,技术的在前面,且从大到小排序
// 偶数在后面,也是从大到小排序
showSet(set2); // [9, 7, 5, 3, 1, 10, 8, 6, 4, 2]
}
/**
* 混合对象,你要为每个对象类型进行计较控制,避免出现转换异常.
*/
public static void testMix() {
// 我们测试混合类型的对象,比如字符串和整数
// 如果我们不指定自己的比较器,而使用默认的自然比较器
// 将发生异常
TreeSet set = new TreeSet(new Comparator() {
@Overri
|