JAVA------集合之TreeSet

TreeSet集合特点

  1. 元素有序, 这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序, 具体排序方式取决于构造方法

  2. TreeSet():根据其元素的自然排序进行排序

  3. TreeSet(Comparator comparator) :根据指定的比较器进行排序

  4. 没有带索引的方法, 所以不能使用普通for循环遍历

  5. 由于是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());
		}
	}		
}

猜你喜欢

转载自blog.csdn.net/weixin_45102820/article/details/113527294