TreeSet类

package 集合类.Set类;
/**
 * Set不允许重复数据
 */


/**
 * TreeSet 是用来进行集合排序的,请注意他和LinkedHashSet的区别。 
 TreeSet是按照一定的规则,将加入到集合里面的数据进行排序,
 而LinkedHashSet是严格按照你放入集合的顺序进行使用
 * @author jjj
 */
import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSet类 {
	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);
		}
		//如果add了相同的数据,是无效的,因为set集合不能重复元素
		set.add(10);
		// 输出看看
		// 可以看到数据为自然的数字排序
		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>() {

			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() {

			public int compare(Object o1, Object o2) {
				// 我们用字符串比较好了
				return o1.toString().compareTo(o2.toString());
			}

		});
		for (int i = 10; i >= 1; i--) {
			set.add(i); // 存入整数
			set.add(i + ""); // 存入字符串
		}
		// 输出看看
		// 里面的内容确实按照字符串进行排序了。
		// 数字被转化为字符串再参与比较。
		showSet(set); // [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
	}

	/**
	 * 显示Set里面的数据。
	 * 
	 * @param set
	 */
	private static void showSet(Set set) {
		System.out.println(Arrays.toString(set.toArray()));
	}
}

// 注意,我指定了强制类型的比较器
class MyIntegerComparator implements Comparator<Integer> {

	public int compare(Integer o1, Integer o2) {
		return o2.compareTo(o1);// 使用反向的比较
	}
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值