TreeSet

Posted yaobiluo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TreeSet相关的知识,希望对你有一定的参考价值。

TreeSet   保证元素唯一  并且排序

  添加对象时  对象必须有排序功能,如果没有,则报classException

  能不能存进去,看的就是比较器的比较结果

两种排序方法:

1、 实现comparable接口,重写compareTo()方法

@Override
    public int compareTo(Person o) 
        /*int num = this.age-o.age;   // 年龄是主要条件,name是次要排序
        return num == 0 ? this.name.compareTo(o.name) : num;*/
        /*int num = this.name.compareTo(o.name);
        return num == 0 ? this.age - o.age : num ;*/
        
        //按照姓名长度排序
        int length = this.name.length() - o.name.length();
        return length == 0 ? this.age - o.age: length;        ##  先比较首要的 ,再比较次要的
    

compareTo() 返回0 : 不存
返回正数 : 集合中怎么存怎么取
返回负数 : 倒序存储

 

 

     二叉树原理   :

        每次存的时候 都要比较,小的在左边,大的在右边。

        取得时候,先去左边的,即取小的

 2、比较器排序

import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.TreeSet;

public class test4 
    //  无序且重复的字符串,   将其排序并且不去除重复
    public static void main(String[] args) 
        ArrayList<String> a1 = new ArrayList<>();
        a1.add("aaa");
        a1.add("aaa");
        a1.add("ccc");
        a1.add("ddd");
        a1.add("aaa");
        a1.add("fffffff");
        a1.add("aaa");
        a1.add("heima");
        a1.add("dfasd");
        a1.add("aaa");
        sort(a1);
        System.out.println(a1);
    
    // 定义方法排序  并保留重复
    public static void sort(List<String> list) 
        TreeSet<String> t1 = new TreeSet<>(new liuchong());   //  传入的是比较器    这个地方可以直接传匿名内部类
        t1.addAll(list);
        list.clear();
        list.addAll(t1);        
    


class liuchong implements Comparator<String>    //实现比较器

    @Override
    public int compare(String o1, String o2) 
        int num = o1.compareTo(o2); 
        return num == 0 ? 1 : num ;    //   当num == 0时  表示相等,本来就不会存了,但是此时我们返回1,那么就会存了
    
    

 

 

public class test5 
    /*
     *从键盘接收一个字符串,程序对其中所有字符进行排序,例如键盘录入hellitcast     排序 保留重复
     */
    public static void main(String[] args)         
        paixu();
    

    public static void paixu() 
        Scanner s1 = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String s2 = s1.nextLine();        
        char[] c1 = s2.toCharArray();
        ArrayList<Character> a1 = new ArrayList<>();
        for (char c : c1) 
            a1.add(c);
        
        System.out.println(a1);
        sort(a1);
        for (Character character : a1) 
            System.out.print(character);
        
    
    
    public static void sort(ArrayList<Character> list)                
        TreeSet<Character> t1 = new TreeSet<>(new Liu());
        t1.addAll(list);
        list.clear();
        list.addAll(t1);
        
    


class Liu implements Comparator<Character>

    @Override
    public int compare(Character ch1, Character ch2) 
        int num = ch1 - ch2;
        return num == 0 ? 1:num;
    
    
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;

public class test6 
    /*
     * 程序启动后 可以从键盘接收多个整数,直到输入quit时结束输入,
     * 将所有输入的整数倒叙排列打印
     */
    public static void main(String[] args) 
        Scanner s1 = new Scanner(System.in);
        TreeSet<Integer> t1 = new TreeSet<>(new Comparator<Integer>()      //  匿名内部类,  其实是  Comparator的子类对象

            @Override
            public int compare(Integer i1, Integer i2) 
                int num = i2 - i1 ;    //  i2  - i1  就是反着排序了
                return num == 0 ? 1 : num;
            
            
        );
        
        while (true) 
            String line = s1.nextLine();
            if ("quit".equals(line)) 
                break;
             
            Integer integer = Integer.parseInt(line);
            t1.add(integer);
        
        for (Integer i : t1) 
            System.out.println(i);
        
        
        
    

 

 

public class test7 
    /*
     * 键盘录入5个学生信息(姓名,语,数,外成绩),按照总分从高到低输出控制台
     */
    public static void main(String[] args) 
        TreeSet<Student> t1 = new TreeSet<>(new ssort());
        Scanner s1 = new Scanner(System.in);
        System.out.println("请输入学生信息,格式是姓名,语,数,外");
        while (t1.size() <5) 
            String s2 = s1.nextLine();
            String[] c1 = s2.split(",");
            String name = c1[0];
            int yu = Integer.parseInt(c1[1]);
            int shu = Integer.parseInt(c1[2]);
            int wai = Integer.parseInt(c1[3]);
            t1.add(new Student(name,yu,shu,wai));
        
        s1.close();
        for (Student student : t1) 
            System.out.println(student);
        
        
    


class ssort implements Comparator<Student>

    @Override
    public int compare(Student sa, Student sb) 
        int num = sb.getSum() - sa.getSum();
        return num == 0 ? 1 :num ;
    
    

 

以上是关于TreeSet的主要内容,如果未能解决你的问题,请参考以下文章

一起学习集合框架之 TreeSet

函数入参使用指针和引用的区别

java中collection是啥?怎么理解?怎么使用?

Java中Set集合怎样用for遍历?