集合TreeSet【java】

    xiaoxiao2021-03-26  24

    TreeSet:能够对元素按照某种规则进行排序。

    TreeSet排序方式:TreeSet是构造了一个二叉树,如果大于就在右子数,小于就在左子树,等于就不用管

    排序有两种方式 A:自然排序 B:比较器排序

    TreeSet的特点:排序和唯一

    创建无参构造的TreeSet对象的排序方式是自然排序

    创建带参构造的TreeSet对象的排序方式是比较器排序

    A:自然排序 自定义:创建集合对象时是无参构造 如果一个类进行自然排序,那么这个类就要实现自然排序的接口Compareable B:比较器排序 自定义:创建集合对象时是带参构造,参数是new 自定义的类(),这个自定义的类要实现Comparator接口

    在自定义存储中无论是自然排序还是比较器排序重写compareTo方法时,都是不紧要比较首要条件也要比较次要条件

    自定义存储中,自然排序是Compareable,比较器排序是compareTo,注意不一样的哦

    自然排序的代码:

    封装类person中

    package day17.treeSet.zdy; /** * 如果一个类进行自然排序,那么这个类就要实现自然排序的接口Compareable * @author Fanny * * * TreeSet自然排序是构造了一个二叉树,如果大于就在右子数,小于就在左子树,等于就不用管 * */ public class Person implements Comparable<Person>{ private String name; private int age; 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 Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { super(); } @Override public int compareTo(Person o) { //比较的首要条件就得有两个变量,但是这只有一个参数o,那么那一个在哪呢? // 由于加入进去的就是this,因此那一个就用this. 进行调用 //根据要求先比较首要条件年龄 int num = this.age-o.age; //但是如果只考虑首要条件,就不准确,因为会有年龄相同而姓名不相同,不考虑次要条件,那么这种情况就会被舍弃,显然不合理。 //因此当年龄相同时(num==0)就比较姓名,根据姓名的比较差进行返回, // 不相同时,根据年龄差进行返回 int num2 = num == 0 ? this.name.compareTo(o.name) : num; return num2; } } 测试类:

    package day17.treeSet.zdy; /** * TreeSet采用自定义存储,保证 唯一和排序 * 排序方式:采用自然排序,按照年龄进行排序 * 成员变量值都相同即相同 */ import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { TreeSet<Person> ts = new TreeSet<>(); Person p1 = new Person("abc",27); Person p2 = new Person("bcd",25); Person p3 = new Person("def",22); Person p4 = new Person("abc",27); Person p5 = new Person("npq",18); Person p6 = new Person("hhh",20); Person p7 = new Person("afg",27); Person p8 = new Person("add",22); ts.add(p1); ts.add(p2); ts.add(p3); ts.add(p4); ts.add(p5); ts.add(p6); ts.add(p7); ts.add(p8); for (Person person : ts) { System.out.println(person.getName()+"---"+person.getAge()); } } } 比较器排序:第一种可以自定义一个类实现comparetor接口,也可以使用匿名内部类

    封装类person:成员变量name,age以及带参的构造方法,和setXxx(),getXxx()方法

    自定义一个类实现comparetor接口

    package day17.treeSet.zdy1; import java.util.Comparator; public class MyComparator implements Comparator<Person>{ @Override public int compare(Person o1, Person o2) { int num = o1.getName().length() - o2.getName().length(); int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num; int num3 = num2 == 0 ? o1.getAge() - o2.getAge() : num2; return num3; } } 测试类: package day17.treeSet.zdy1; import java.util.Comparator; import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { //TreeSet<Person> ts = new TreeSet<>(new MyComparator());//自定义一个类MyComparator实现comparetor接口 TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() { //匿名内部类 @Override public int compare(Person o1, Person o2) { int num = o1.getName().length() - o2.getName().length(); int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num; int num3 = num2 == 0 ? o1.getAge() - o2.getAge() : num2; return num3; } }); Person p1 = new Person("wanglihong",27); Person p2 = new Person("linqingxia",30); Person p3 = new Person("xiena",26); Person p4 = new Person("wangzulan",28); Person p5 = new Person("luhan",27); Person p6 = new Person("hejiong",26); Person p7 = new Person("wanglihong",27); Person p8 = new Person("wanglihong",30); ts.add(p1); ts.add(p2); ts.add(p3); ts.add(p4); ts.add(p5); ts.add(p6); ts.add(p7); ts.add(p8); for (Person p : ts) { System.out.println(p.getName()+"---"+p.getAge()); } } }

    转载请注明原文地址: https://ju.6miu.com/read-659004.html

    最新回复(0)