学习任务:

视频学习

Set集合介绍

TreeSet的介绍

TreeSet排序测试

ArrayList是一个单列集合,HashMap和TreeMap都是双列集合,TreeMap是一个天然有序集合,适合排序场景但不适合大数量搜索场景,HashMap适合大数量搜索的场景,有没有一种数据结构是单列集合同时还具有TreeMap和Hashmap的优势呢?

Set集合是一种单列集合,它是Collection集合的子接口,Set接口无特有方法,它的使用方式和Collection集合基本一致。

它的特点是:

1、元素无序(不保证存储和取出的顺序一致)

2、元素唯一

3、元素无索引,不能使用for循环进行遍历

Set集合常用的实现类有HashSet、TreeSet,HashSet的底层是哈希表,TreeSet的底层是红黑树,所以,HashSet是单列集合同时具有了HashMap的优势,TreeSet也是单列集合同时具有了TreeMap的优势。

TreeSet与TreeMap 一样都可以对元素进行排序,与TreeMap的区别是Set是单列集合,Map是双列集合。

TreeSet的特点为:

1、元素唯一

2、元素没有索引

3、可以使用自然排序或比较器排序对元素进行排序

下边测试TreeSet的排序特性,TreeSet同HashMap 一样可以使用自然排序及 Comparator (比较器) 进行排序,推荐使用比较器排序。

使用比较器排序方法需要在构造TreeSet对象时向构造参数传入比较器Comparator的对象。

Comparator是一个接口,如下:

public interface Comparator<T> {
	//比较两个数
	int compare(T o1, T o2);
	...
}

int compare(T o1, T o2);方法实现两个数的比较,o1为新数,o2为旧数,每次向TreeMap集合添加一个数会拿新数比较旧数。

Comparator详细的使用方法可以参考TreeMap比较器排序章节,下边列出int compare(T o1, T o2)方法的规则,

根据compare方法的返回值决定排序结果:

1、返回的是一个大于0的数

新数大于旧数,将新数放在右子树。

2、返回的是一个小于0的数

新数小于旧数,将新数放在左子树。

3、返回的是一个等于0的数

返回0说明新数与旧数相等,新数的value值替换旧数的value值。

下边将课程信息按价格降序,价格相同的按课程Id升序排序。

1)PbCourse类

package com.pbteach.javase.oop.set.test2;

/**
 * 	课程类
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class PbCourse {
	
	//课程标识
	private long id;
	//课程名称
	private String courseName;
	//课程价格
	private int price;
	
	public PbCourse() {
		
	}
	public PbCourse(long id, String courseName, int price) {
		this.id = id;
		this.courseName = courseName;
		this.price = price;
	}
	//getter/setter方法...
	
	@Override
	public int compareTo(PbCourse o) {
		//没有比较器时按id排序
		return (int) (this.getId()-o.getId());
	}
	
	@Override
	public String toString() {
		return "PbCourse [id=" + id + ", courseName=" + courseName + ", price=" + price + "]";
	}

}

2)排序测试代码

package com.pbteach.javase.pop.set.test2;

import java.util.Set;
import java.util.TreeSet;


/**
 * TreeSet测试
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class TreeSetTest1 {
	
	public static void main(String[] args) {
		Set<PbCourse> set = new TreeSet<PbCourse>((s1,s2)->{
			//默认按价格降序
			int r = s2.getPrice() - s1.getPrice();
			//价格相同按名称字典顺序
			return r!=0?r:(int)(s1.getId()-s2.getId());
		});
		set.add(new PbCourse(100L, "攀博课堂-Java面向对象教程", 33));
		set.add(new PbCourse(101L, "攀博课堂-Spring全家桶教程", 44));
		set.add(new PbCourse(102L, "攀博课堂-SpringCloud微服务教程", 55));
		set.add(new PbCourse(103L, "攀博课堂-在线教育分布式项目教程", 66));
		set.add(new PbCourse(105L, "攀博课堂-电子商务项目教程", 66));
		set.add(new PbCourse(106L, "攀博课堂-移动支付项目教程", 66));
		//遍历
		set.forEach(System.out::println);
				
	}
	

}

输出:

PbCourse [id=103, courseName=攀博课堂-在线教育分布式项目教程, price=66]
PbCourse [id=105, courseName=攀博课堂-电子商务项目教程, price=66]
PbCourse [id=106, courseName=攀博课堂-移动支付项目教程, price=66]
PbCourse [id=102, courseName=攀博课堂-SpringCloud微服务教程, price=55]
PbCourse [id=101, courseName=攀博课堂-Spring全家桶教程, price=44]
PbCourse [id=100, courseName=攀博课堂-Java面向对象教程, price=33]
提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题