TreeSet集合特点
- 元素有序, 这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序, 具体排序方式取决于构造方法
- TreeSet():根据其元素的自然排序进行排序
- TreeSet(Comparator comparator) :根据指定的比较器进行排序
- 没有带索引的方法, 所以不能使用普通for循环遍历
- 由于是Set集合, 所以不包含重复元素的集合
看一段代码:
package Set;
import java.util.TreeSet;
public class TreeSetDemo01 {
public static void main(String[] args) {
//集合创建要使用引用,即包装类
TreeSet<Integer> ts=new TreeSet<>();
//自然排序
ts.add(20);
ts.add(40);
ts.add(30);
ts.add(10);
ts.add(30);
for(Integer i:ts) {//输出10 20 30 40
System.out.println(i);
}
}
}
集合中添加20,40,30,10,30,最后输出10 20 30 40,按照自然顺序输出。
自然排序
下边看一个案例:
存储学生对象并遍历,创建集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名字母顺序排序
先创建学生类:
package Set;
public class student implements Comparable<student>{
private String name;
private int age;
//构造方法
public student() {
System.out.println("无参构造");
}
public student(String name,int age) {
this.name=name;
this.age=age;
}
//提供get/set方法
public void setAge(int age) {
if(age<0||age>100)
{
System.out.println("年龄有误");
}else {
this.age=age;
}
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void show() {
System.out.println(name+","+age);
}
@Override
public int compareTo(student s) {
//return 0;//重复元素,不添加
//return 1;//按照输入升序排序
//return -1;//按照输入逆序排序
int num=this.age-s.age;//年龄升序 this为s2,s为s1
//int num=s.age-this.age;//降序
int num2=num==0?this.name.compareTo(s.name):num;
return num2;
}
}
自然排序, 就是让元素所属的类实现Comparable接口,重写compareTo(To)方法
- return 0;//重复元素,不添加
- return 1;//按照输入升序排序
- return -1;//按照输入逆序排序
下边这行代码是判断两个人年龄如果相同,就比较姓名,因为String是对compareTo进行重写过的,因此可直接使用
int num2=num==0?this.name.compareTo(s.name):num;
@Override
public int compareTo(student s) {
//return 0;//重复元素,不添加
//return 1;//按照输入升序排序
//return -1;//按照输入逆序排序
int num=this.age-s.age;//年龄升序 this为s2,s为s1
//int num=s.age-this.age;//降序
int num2=num==0?this.name.compareTo(s.name):num;
return num2;
}
main:
package Set;
import java.util.TreeSet;
public class TreeSetDemo02 {
public static void main(String[] args) {
//集合创建要使用引用,即包装类
TreeSet<student> ts=new TreeSet<>();
student s1=new student("小李",20);
student s2=new student("小李",50);
student s3=new student("小张",35);
student s4=new student("小王",18);
student s5=new student("小康",35);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(student s:ts) {
System.out.println(s.getName()+","+s.getAge());
}
}
}
指定的比较器排序
直接看一个案例:
存储学生对象并遍历,创建集合使用带参构造方法
*要求:按照年龄从小到大排序,年龄相同时,按照姓名字母顺序排序
根据制定的比较器排序,肯定是要在类中实现Comparator接口
这里直接使用匿名内部类实现Comparator接口
学生类:
package Set;
public class student03{
private String name;
private int age;
//构造方法
public student03() {
System.out.println("无参构造");
}
public student03(String name,int age) {
this.name=name;
this.age=age;
}
//提供get/set方法
public void setAge(int age) {
if(age<0||age>100)
{
System.out.println("年龄有误");
}else {
this.age=age;
}
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void show() {
System.out.println(name+","+age);
}
}
main:
package Set;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo03 {
public static void main(String[] args) {
TreeSet<student03> ts=new TreeSet<student03>(new Comparator<student03>() {
@Override
public int compare(student03 s1,student03 s2) {//匿名内部类实现Comparator接口
//this.age-s.age
//s1 s2
int num=s1.getAge()-s2.getAge();
int num2=num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});
student03 s1=new student03("小李",20);
student03 s2=new student03("小李",50);
student03 s3=new student03("小张",35);
student03 s4=new student03("小王",18);
student03 s5=new student03("小康",35);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(student03 s:ts) {
System.out.println(s.getName()+","+s.getAge());
}
}
}