java Set-----TreeSet类

  • TreeSet: * 基于 TreeMap 的 NavigableSet 实现。 * 1 使用元素的自然顺序对元素进行排序
    使用空构造器 TreeSet ts= new TreeSet<>(); 2 或者根据创建 set 时提供的 Comparator 进行排序 * TreeSet ts= new
    TreeSet<>(Comparator cp);
    具体取决于使用的构造方法。 * 父接口:Set * 注意,此实现不是同步的。 * 从以下版本开始: 1.2 * 注意:不允许添加null元素 * * TreeSet的特点:去重且排序
    • 对一组数字按照从小到大排序,并且去除重复元素 * 10,20,500,-60,8,41,22,36,20 * * 数组排序去重复 * 2个对象做比较结果为0,表示相等 * 2个对象做比较结果为-1,表示小于 *
      2个对象做比较结果为1,表示大于 * * 大的往右走,小的往左走,相等不进来

import java.util.TreeSet;

public class Demo {
	
	  public static void main(String[] args) {
		TreeSet<Integer> ts = new TreeSet<>();
		ts.add(10);
		ts.add(20);
		ts.add(500);
		ts.add(-60);
		ts.add(8);
		ts.add(41);
		ts.add(22);
		ts.add(36);
		ts.add(20);
		System.out.println(ts);
	}
}

红黑树

  • TreeSet:基于红黑树的二叉树(一种自平衡的二叉树)
    * R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
    * 红黑树的特性:
    * (1)每个节点或者是黑色,或者是红色。
    * (2)根节点是黑色。
    * (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
    * (4)如果一个节点是红色的,则它的子节点必须是黑色的。
    * (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
    * 注意:
    * (01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
    * (02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。
    *
    *
    * 引用类型的数据放入TreeSet中,可以自动排序,而且去重
    * TreeSet有2中排序方案
    * 1:自然排序,创建无参的构造器 实现Comparable接口,并且重写CompareTo()方法
    * 2:比较器排序,构造一个新的空 TreeSet,它根据指定比较器进行排序。 实现Compartor接口,重写compare方法
import java.util.TreeSet;

public class Demo2 {
	
	/*
	 
	 */
	public static void main(String[] args) {
		
		TreeSet<Integer> ts = new TreeSet<>();
		
		ts.add(2);
		ts.add(1);
		ts.add(3);
		ts.add(4);
		ts.add(5);
		ts.add(7);
		ts.add(6);
		ts.add(6);
		ts.add(8);
		ts.add(9);
		System.out.println(ts);
		
		
	}

}

Demo

  • TreeSet 自定义对象排序且去重
    * 按照价格从小到大排序
import java.util.TreeSet;

public class Demo {

	public static void main(String[] args) {
		//1:创建一个set集合
		TreeSet<Product> ts = new TreeSet<>();
		//2:添加产品
		ts.add(new Product("p1001", "电脑", 5000D, "武汉"));
		ts.add(new Product("p1002", "键盘", 200D, "北京"));
		ts.add(new Product("p1002", "键盘", 200D, "上海"));
		ts.add(new Product("p1001", "电脑", 5000D, "武汉"));
		//3:变量集合
		System.out.println("编号\t名称\t价格\t出产地");
		for (Product p : ts) {
			System.out.println(p.getId()+"\t"+p.getName()+"\t"+p.getPrice()+
			"\t"+p.getAddress());
		}
		
	
		
	}

}

注意方法的重写

public class Product implements Comparable<Product> {
	
	private String id;
	private String name;
	private Double price;
	private String address;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Product(String id, String name, Double price, String address) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
		this.address = address;
	}
	public Product() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public int compareTo(Product p) {
		//什么叫重复对象:所有属性的值完全相同,才成为同一个对象
		//按照价格排序   主要条件
		int num = (int)(this.getPrice()-p.getPrice());
		//次要条件1 价格相同,编号不一定相同
		int num1 = num==0?this.getId().compareTo(p.getId()):num;
		//次要条件2 价格,编号相同,名称不一定相同
		int num2 = num1==0?this.getName().compareTo(p.getName()):num1;
		//次要条件3 价格,编号,名称相同,出产地不一定相同
		int num3 = num2==0?this.getAddress().compareTo(p.getAddress()):num2;
		return num3;
		
		/*int num = (int)(this.getPrice()-p.getPrice());
		//次要条件1 价格相同,编号不一定相同
		   num = num==0?this.getId().compareTo(p.getId()):num;
		//次要条件2 价格,编号相同,名称不一定相同
		   num = num==0?this.getName().compareTo(p.getName()):num;
		//次要条件3 价格,编号,名称相同,出产地不一定相同
		   num = num==0?this.getAddress().compareTo(p.getAddress()):num;
		return num;*/
		
		/*int n = (int)(this.getPrice()-p.getPrice());
		if(n==0){
			n = this.getId().compareTo(p.getId());
		}
		if(n==0){
			n = this.getName().compareTo(p.getName());
		}
		if(n==0){
			n = this.getAddress().compareTo(p.getAddress());
		}
		return n;*/
	}
	
	
	
	

}

  • 自定义对象排序
    *
    * 按照学生的总分排序 使用自然排序
    * 1:实现Comparable接口,重写CompareTo方法
    *
    * 按照学生的总分排序 使用比较器排序
    * 2:实现Comparator,重写compare方法

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

public class Demo {

	public static void main(String[] args) {
	
		/*TreeSet<Student> ts = new TreeSet<>();
		
		ts.add(new Student("1","张三",20,100,99,88));
		ts.add(new Student("2","李四",18,99,88,100));
		ts.add(new Student("3","王五",18,78,68,75));
		ts.add(new Student("4","赵柳",17,45,68,100));
		ts.add(new Student("1","张三",20,100,99,88));*/
		
		TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {

			@Override
			public int compare(Student s1, Student s2) {
				//主要条件  按照总分排序
				int num = s1.result()-s2.result();
				//次要条件1 总分相同,学号不一定相同
				num = num==0?s1.getId().compareTo(s2.getId()):num;
				//次要条件2 总分,学号相同,姓名不一定相同
				num = num==0?s1.getName().compareTo(s2.getName()):num;
				//次要条件3 总分,学号,姓名相同,年龄不一定相同
				num = num==0?(s1.getAge()-s2.getAge()):num;
				//次要条件4 总分,学号,姓名,年龄相同,语文不一定相同
				num = num==0?(s1.getChinese()-s2.getChinese()):num;
				//次要条件5 总分,学号,姓名,年龄,语文相同,数学不一定相同
				num = num==0?(s1.getMath()-s2.getMath()):num;
				//次要条件6 总分,学号,姓名,年龄,语文,数学相同,英语不一定相同
				num = num==0?(s1.getEnglish()-s2.getEnglish()):num;
				return num;
			}
		});
		
		ts.add(new Student("1","张三",20,100,99,88));
		ts.add(new Student("2","李四",18,99,88,100));
		ts.add(new Student("3","王五",18,78,68,75));
		ts.add(new Student("4","赵柳",17,45,68,100));
		ts.add(new Student("1","张三",20,100,99,88));
		
		System.out.println("学号\t姓名\t年龄\t语文成绩\t数学成绩\t英语成绩\t总分");
		
		for (Student stu : ts) {
			System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getAge()+"\t"+
		        stu.getChinese()+"\t"+stu.getMath()+"\t"+stu.getEnglish()+
		        "\t"+stu.result());
			
		}
	}

}


public class Student/* implements Comparable<Student>*/ {
	
	private String id;
	private String name;
	private int age;
	private int chinese;
	private int math;
	private int english;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	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 int getChinese() {
		return chinese;
	}
	public void setChinese(int chinese) {
		this.chinese = chinese;
	}
	public int getMath() {
		return math;
	}
	public void setMath(int math) {
		this.math = math;
	}
	public int getEnglish() {
		return english;
	}
	public void setEnglish(int english) {
		this.english = english;
	}
	public Student(String id, String name, int age, int chinese, int math, 
	int english) 
	{
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.chinese = chinese;
		this.math = math;
		this.english = english;
	}
	public Student() {
		super();
	}
	//总分
	public int result(){
		return chinese+math+english;
	}
	/*@Override
	public int compareTo(Student s) {
		//主要条件  按照总分排序
		int num = s.result()-this.result();
		//次要条件1 总分相同,学号不一定相同
		num = num==0?this.getId().compareTo(s.getId()):num;
		//次要条件2 总分,学号相同,姓名不一定相同
		num = num==0?this.getName().compareTo(s.getName()):num;
		//次要条件3 总分,学号,姓名相同,年龄不一定相同
		num = num==0?(this.getAge()-s.getAge()):num;
		//次要条件4 总分,学号,姓名,年龄相同,语文不一定相同
		num = num==0?(this.getChinese()-s.getChinese()):num;
		//次要条件5 总分,学号,姓名,年龄,语文相同,数学不一定相同
		num = num==0?(this.getMath()-s.getMath()):num;
		//次要条件6 总分,学号,姓名,年龄,语文,数学相同,英语不一定相同
		num = num==0?(this.getEnglish()-s.getEnglish()):num;
		return num;
	}
	*/
	

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。
### 回答1: 在Java中,Set是一种集合数据结构,它不允许重复元素,并且没有固定的顺序。然而,Java中的TreeSet是一种基于红黑树数据结构的Set实现,它可以自定义排序规则。 TreeSet是一个有序的集合,它维护了一个基于元素值的红黑树结构。默认情况下,TreeSet按照元素的自然顺序进行排序。例如,如果元素是整数,则按照从小到大的顺序排列;如果元素是字符串,则按照字典顺序进行排序。 但是,TreeSet也可以使用自定义的Comparator接口实现来指定排序规则。Comparator接口定义了一个compare()方法,它接受两个参数并返回一个int值。如果第一个参数小于第二个参数,则返回负整数;如果第一个参数大于第二个参数,则返回正整数;如果两个参数相等,则返回0。 例如,我们可以创建一个按照字符串长度进行排序的TreeSet,如下所示: ```java TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length() - o2.length(); } }); treeSet.add("hello"); treeSet.add("world"); treeSet.add("java"); ``` 在这个例子中,我们创建了一个TreeSet并使用了一个自定义的Comparator实现。这个Comparator实现比较两个字符串的长度,并按照长度从小到大的顺序排序。 最终,这个TreeSet中的元素将按照长度从小到大的顺序排列,输出结果为: ``` [java, hello, world] ``` ### 回答2: 在使用Java集合中的TreeSet时,我们默认使用其自然排序规则对元素进行排序。但有时候,我们需要根据自定义的规则对元素进行排序,这时我们可以使用TreeSet提供的自定义排序方法——Comparator。 Comparator是一个接口,其定义了两个方法,分别是compare()和equals()。其中,compare()方法接收两个参数,分别是要比较的对象x和y,这两个对象需要实现Comparator接口;equals()方法用于比较两个对象是否相等。 假设有一个存放Person对象的TreeSet集合,我们需要根据Person的年龄属性进行升序排序,可以通过以下步骤实现: 1. 定义一个Person,包含name和age两个属性,以及相应的getter和setter方法; 2. 在Person中实现Comparator接口,并重写compare()方法,在方法中对年龄属性进行比较; 3. 创建一个TreeSet集合,并在构造函数中传入自定义的Comparator对象; 4. 将多个Person对象添加到TreeSet集合中。 具体的代码实现如下: ``` import java.util.*; class Person implements Comparator<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public int compare(Person p1, Person p2) { if (p1.getAge() > p2.getAge()) { return 1; } else if (p1.getAge() < p2.getAge()) { return -1; } else { return 0; } } } public class TreeSetDemo { public static void main(String[] args) { TreeSet<Person> set = new TreeSet<Person>(new Person()); set.add(new Person("张三", 28)); set.add(new Person("李四", 20)); set.add(new Person("王五", 25)); for (Person p : set) { System.out.println(p.getName() + " " + p.getAge()); } } } ``` 在代码中,我们定义了一个Person,它实现了Comparator接口,并重写了compare()方法,根据Person对象的age属性进行比较。在主方法中,我们创建了一个TreeSet集合,并在其中添加了多个Person对象,它们会被按照年龄的升序排序。最后,我们通过foreach循环遍历集合中的所有元素,并输出它们的name和age属性。 需要注意的是,在使用自定义比较器时,如果想要保证集合中没有重复元素,我们还需要在Person中重写equals()方法,并根据name和age两个属性进行比较。 ### 回答3: 在使用Java集合中的TreeSet时,数据默认情况下是按照自然顺序进行排序的。但是在某些情况下,我们可能希望按照自己定义的规则进行排序。这时,就需要使用TreeSet的自定义排序规则。 自定义排序规则需要我们实现Comparator接口中的compare方法。该方法用于对实现了Comparable接口的对象进行比较。因此,我们需要在自定义中实现该接口,并重写其中的compare方法。 接下来,我们以Student为例,介绍如何实现TreeSet的自定义排序规则。假设我们希望按照学生的分数进行从高到低的排序。 首先,在Student中实现Comparable接口 public class Student implements Comparable<Student>{ private String name; private int score; public Student(String name, int score) { this.name = name; this.score = score; } @Override public int compareTo(Student o) { return o.score - this.score; } } 在该中,我们通过重写compareTo方法,实现了按照学生分数进行排序的规则。 接下来,在使用TreeSet时,我们需要传入一个Comparator对象,该对象用于指定TreeSet中元素的排序规则。示例代码如下: TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o2.getScore() - o1.getScore(); } }); 在该代码中,我们通过匿名的方式实现了Comparator接口,并重写了其中的compare方法。通过该方法,我们指定了从高到低的排序规则。 通过以上的示例代码,我们可以看出,自定义排序规则的具体实现可以根据具体情况进行调整。而在该实现中,我们需要注意以下几点: 1. 实现Comparable接口,用于指定对象的默认排序规则。 2. 实现Comparator接口,在特定情况下自定义排序规则。 3. 在使用TreeSet时,需要传入一个Comparator对象,用于指定排序规则。 以上就是Java集合settreeset之自定义排序规则的详细介绍。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值