Day 7:TreeSet

补充上一日:HashCode方法默认返回的是内存地址,String类已经重写了对象的HashCode方法

 方法细节:取出数组中的值或字符串的值按照规定计算返回一个值,如果两个字符串内容一致就会返回相同的HashCode码

TreeSet

 treeSet添加自定义元素注意事项

  1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。

  2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素

   的比较规则定义在compareTo(T o)方法上。
  
  3. 如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加.(注意:TreeSet与HashCode、equals方法是没有任何关系。)
  
    4. 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个
    比较器,
  

//自定义比较器的格式 :
             
             class  类名  implements Comparator{
               public int compare(To o1, To o2) {
             return o1.id-o2.id;
           }
       }

  5.  往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口, 在创建TreeSet对象的时候也传入了比较器

          那么是以比较器的比较规则优先使用。

推荐使用:使用比较器(Comparator)。,使得其他类也可以用,提高复用性

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


class  gongzitiao implements Comparable<gongzitiao>{
    
    int id;
    String name;
    int salary;

    public gongzitiao(int id, String name, int salary) {
        super();
        this.id = id;
        this.name = name;
        this.salary = salary;
    }
    
    @Override
    public String toString() {
        return "{ 编号:"+  this.id+" 姓名:"+ this.name+" 薪水:"+ this.salary+"}";
    }

    public int compareTo(gongzitiao o) {
        return this.salary- o.salary;
    }    
}

//自定义比较器
class MyComparator implements Comparator<gongzitiao>{

    @Override
    public int compare(gongzitiao o1, gongzitiao o2) {
        return o1.id-o2.id;
    }
}

public class Demo1 {
    
    public static void main(String[] args) {
        MyComparator comparator = new MyComparator();
        TreeSet tree = new TreeSet(comparator);
        
        tree.add(new gongzitiao(114, "李杰", 520));
        tree.add(new gongzitiao(117, "嘻嘻", 250));
        tree.add(new gongzitiao(141, "李英", 258));
        tree.add(new gongzitiao(120, "李汉三", 2580));
        System.out.println(tree);
    }
}

 

TreeSet存储原理

  底层是使用红黑树(二叉树)数据结构实现的

  存储规则:左小右大

  当重复元素加入时 treeSet调用compareTo方法,返回值如果是零就视为重复元素,就无法加入二叉树中。

  注意:如果加入三组数据无法形成二叉树结构就会发生下面变化

  目的:减少比较次数

TreeSet对字符串进行排序

原因:因为字符串已经实现了Comparable接口所以可以排序

字符串的比较规则:
 
   一、 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。

   二、对应位置上 的字符都一样,比较的就是字符串的长度。

public class Demo2 {
    public static void main(String[] args) {
        /*TreeSet tree = new TreeSet();
        tree.add("abcccccccccccccccccc");
        tree.add("abc");
        System.out.println(tree);*/
        System.out.println("abw".compareTo("abcccccccccccc"));    
    }
}

作业:将字符串中的数值进行排序。
    例如String str="8 10 15 5 2 7"; ---->   "2 5 7 8 10 15"

import java.util.Iterator;
import java.util.TreeSet;

public class Demo3 {
    
    public static void main(String[] args) {
        String str="8 10 15 5 2 7";
        String[] data = str.split(" ");
        
        TreeSet tree = new TreeSet();
        for(int i = 0 ; i<data.length ; i++){
            tree.add(Integer.parseInt( data[i]));
        }
        
        Iterator it = tree.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+" ");
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/JYDesigner/p/9354120.html