了解TreeSet集合

TreeSet类是Set接口的另一个是实现类,TreeSet集合和HashSet集合都可以保证容器内元素的唯一性,但是他们的底层实现方式不同,TreeSet底层使用自平衡的排序二叉树实现的,所以它既能保证元素的唯一性,也可一堆元素进行排序。
TreeSet还提供了一些特有的方法,如下所示:

  • Comparator comparator():如果TreeSet采用定制排序,则返回定制排序所使用的Comparator;如果TreeSet采用自然排序,则返回null。
  • Object first():返回集合中的第一个元素。
  • Object last():返回集合中最后的一个元素。
  • Object lower(Object obj):返回集合中位于obj之前的元素。
  • Object higher(Object obj):返回集合中位于obj之后的元素。
  • SortedSet subset(Object obj1,Object2):返回此Set的子集合,范围从obj1到obj2。
  • SortedSet headset(Object obj):返回此Set的子集合,返回小于obj。
  • SortedSet tailSet(Object obj):返回此Set的子集合,返回大于或等于元素obj。

接下来通过一个demo来了解一下TreeSet。

import java.util.TreeSet;

public class TestTreeSet {
	public static void main(String[] args) {
		TreeSet treeSet=new TreeSet();
		treeSet.add(60);
		treeSet.add(360);
		treeSet.add(120);
		System.out.println(treeSet);
		System.out.println(treeSet.subSet(100, 500));
	}

}

运行结果:

在这里插入图片描述

运行结果说明TreeSet中元素是有序的,且这个顺序不是添加时的顺序,是根据元素实际值的大小进行排序的。
TreeSet有两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用的是自然排序。

1、自然排序
TreeSet类会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合内元素按升序排列,这就是自然排序。
Java提供了Comparable接口,他里面定义了一个compareTo(Object obj)方法,实现Comparable接口时必须要实现该方法,在方法中实现对象比较。当该方法被调用时,例如obj1.compareTo(obj2),若该方法返回0,则说明obj1和obj2相等;若返回一个正整数,则说明obj1大于obj2;若该方法返回一个负整数,则说明obj1小于obj2.

另外,向TreeSet集合中添加的应该是同一个类的对象,否则会报ClassCastException异常。

2、定制排序
TreeSet的自然排序是根据集合元素大小,按升序排序,如果需要按特殊规则排序或者元素自身不具备比较性时,就需要用到定制排序,比如按降序排列。Comparator包含一个int compare(T t1,T t2)方法,该方法可以比较t1和t2大小,若返回正整数,则说明t1大于t2;若返回0,则说明t1等于t2;若返回负整数,则说明t1小于t2。
实现TreeSet的定制排序时,只需要在创建TreeSet集合对象时,提供一个Comparator对象于该集合关联,在compare中编写排序逻辑。
接下来以一个案例来演示:

import java.util.Comparator;
import java.util.TreeSet;


class Student{
	private Integer age;

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Student(Integer age) {
		this.age = age;
	}
	public String toString() {
		return age+"";
	}
	
}

class MyComparator implements Comparator{    //第一步:实现Comparator接口
	//第二步:实现一个compare方法,判断对象是否特定类的一个实例
	public int compare(Object o1,Object o2) {   
		if(o1 instanceof Student & o2 instanceof Student) {
			Student s1=(Student)o1;  //强制转换为Student类型
			Student s2=(Student)o2;
			if(s1.getAge()>s2.getAge()) {
				return -1;
			}
			else if(s1.getAge()<s2.getAge()){
				return 1;
			}
		}
		return 0;
	}
}

public class TestTreeSetSort {
	public static void main(String[] args) {
		//第三步:创建一个TreeSet集合对象时,提供一个Comparator对象
		TreeSet treeSet=new TreeSet(new MyComparator());  
		treeSet.add(new Student(140));
		treeSet.add(new Student(12));
		treeSet.add(new Student(15));
		System.out.println(treeSet);
	}
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是代码实现: ``` import java.util.TreeSet; public class Student implements Comparable<Student> { private String name; private int age; private String className; public Student(String name, int age, String className) { this.name = name; this.age = age; this.className = className; } public String getName() { return name; } public int getAge() { return age; } public String getClassName() { return className; } // 按照姓名排序 @Override public int compareTo(Student o) { return this.name.compareTo(o.getName()); } @Override public String toString() { return "姓名:" + this.name + ", 年龄:" + this.age + ", 班级:" + this.className; } } public class Main { public static void main(String[] args) { TreeSet<Student> students = new TreeSet<>(); students.add(new Student("Tom", 18, "Class 1")); students.add(new Student("Jerry", 19, "Class 2")); students.add(new Student("Mary", 20, "Class 3")); for (Student stu : students) { System.out.println(stu.toString()); } } } ``` 以上就是一个简单的学生类以及使用TreeSet存储学生对象并按照姓名排序的实现。 注意:以上代码中有一些Java编程的语法,如果您不了解,请自行参考学习Java编程语言。 ### 回答2: 学生类Student的定义如下: ```java public class Student implements Comparable<Student> { private String name; private int age; private String className; public Student(String name, int age, String className) { this.name = name; this.age = age; this.className = className; } // Getters and Setters public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } // Comparable interface implementation @Override public int compareTo(Student other) { return this.name.compareTo(other.name); } } ``` 接下来,使用TreeSet集合来存储学生对象,并按照姓名排序显示: ```java import java.util.*; public class Main { public static void main(String[] args) { // 创建学生对象 Student student1 = new Student("张三", 18, "1班"); Student student2 = new Student("李四", 20, "2班"); Student student3 = new Student("王五", 19, "1班"); // 创建TreeSet集合 TreeSet<Student> students = new TreeSet<Student>(); // 向TreeSet添加学生对象 students.add(student1); students.add(student2); students.add(student3); // 遍历TreeSet,按照姓名排序显示学生对象 for (Student student : students) { System.out.println("姓名:" + student.getName() + ",年龄:" + student.getAge() + ",班级:" + student.getClassName()); } } } ``` 执行以上代码,输出结果如下: ``` 姓名:李四,年龄:20,班级:2班 姓名:王五,年龄:19,班级:1班 姓名:张三,年龄:18,班级:1班 ``` 可以看到,根据姓名进行排序后,学生对象按照姓名的字典顺序显示。 ### 回答3: 1、首先定义一个学生类Student,包括三个属性:姓名name、年龄age和班级className。 ```java public class Student implements Comparable<Student> { private String name; private int age; private String className; // 构造方法 public Student(String name, int age, String className) { this.name = name; this.age = age; this.className = className; } // getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } // 覆盖compareTo方法 @Override public int compareTo(Student student) { return this.name.compareTo(student.getName()); } } ``` 2、定义一个TreeSet集合,用来存储学生对象,并按照姓名排序显示。 ```java import java.util.TreeSet; public class Main { public static void main(String[] args) { // 创建一个TreeSet集合用于存储学生对象 TreeSet<Student> studentSet = new TreeSet<>(); // 添加学生对象到集合中 studentSet.add(new Student("张三", 18, "一班")); studentSet.add(new Student("李四", 17, "二班")); studentSet.add(new Student("王五", 19, "三班")); studentSet.add(new Student("赵六", 16, "一班")); // 遍历集合打印学生信息 for (Student student : studentSet) { System.out.println("姓名:" + student.getName() + ",年龄:" + student.getAge() + ",班级:" + student.getClassName()); } } } ``` 上述代码中,首先定义了一个Student类,包含姓名、年龄和班级属性,并且实现了Comparable接口,重写了compareTo方法来实现按照姓名排序的功能。然后在主函数中创建了一个TreeSet集合用于存储学生对象,并通过add方法向集合添加了几个学生对象。最后通过遍历集合,打印了学生的信息,按照姓名排序显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值