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()+" ");
}
}
}
Day 7:TreeSet的更多相关文章
- Java提高十七:TreeSet 深入分析
		
前一篇我们分析了TreeMap,接下来我们分析TreeSet,比较有意思的地方是,似乎有Map和Set的地方,Set几乎都成了Map的一个马甲.此话怎讲呢?在前面一篇讨论HashMap和HashSet ...
 - java: Set类及子类:TreeSet有序子类,HashSet无序子类:重复元素
		
Set类及子类: TreeSet有序子类: HashSet无序(散列)子类 HashSet子类的内容是没有顺序的,单个元素也不会重复的(对象除外). Set<String> allSet ...
 - Java集合(6):TreeSet
		
一.TreeSet介绍 与HashSet是基于HashMap实现一样,TreeSet是基于TreeMap实现的.TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进 ...
 - 集合系列 Set(八):TreeSet
		
TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现.我们先来看看 TreeSet 的定义. public class TreeSet< ...
 - Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)
		
1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...
 - Java开发笔记(六十五)集合:HashSet和TreeSet
		
对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...
 - 集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)
		
一.集合类 定义:一种为了对多个对象进行操作而进行存储的方式. 1.与数组的区别: 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,数组长度固定. 集合:只能存储对象,长度可变, ...
 - Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别
		
本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSe ...
 - 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)
		
算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...
 
随机推荐
- Docker 简单使用笔记
			
Docker笔记 安装 首先检查是否已经安装过Docker:yum list installed | grep docker,如果已经安装过需要删除旧的Docker:yum remove dock ...
 - 超赞!苹果新一代iPad确定:外形大变样
			
导读 除了iPhone.新MacBook Pro外,苹果还准备新款的入门版iPad,这么来看的话,他们要发布的新品真的是太多了. 据产业链最新消息称,苹果将在今年9月份更新入门版iPad,具体来说就是 ...
 - HDU 5523:Game
			
Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) 问题描述 XY在玩一 ...
 - Unbutu下装oracle
			
Ubuntu 16.04安装Oracle 11gR2入门教程图文详解 转自 https://www.linuxidc.com/Linux/2017-12/149797.htm 原文作 ...
 - Java笔记--基础
			
1.Java中内存的基本结构: 栈(stack):存放局部变量.对象的引用: 堆(heap):new出来的东西(对象) 方法区:常量池等 静态域:全局变量等 变量在其生命周期结束后将出栈,此时堆中的空 ...
 - net Core3.1 Swagger加JWT权限
			
1.Swagger中开启JWT服务 #region swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new ...
 - DCGAN增强图片数据集
			
DCGAN增强图片数据集 1.Dependencies Python 3.6+ PyTorch 0.4.0 numpy 1.14.1, matplotlib 2.2.2, scipy 1.1.0 im ...
 - UVA - 12083 Guardian of Decency (二分匹配)
			
题意:有N个人,已知身高.性别.音乐.运动.要求选出尽可能多的人,使这些人两两之间至少满足下列四个条件之一. 1.身高差>40 2.性别相同 3.音乐不同 4.运动相同 分析: 1.很显然 ...
 - POJ 2305:Basic remains 进制转换
			
Basic remains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5221 Accepted: 2203 Des ...
 - 官网英文版学习——RabbitMQ学习笔记(七)Topic
			
在上一篇中使用直接交换器改进了我们的系统,使得它能够有选择的进行接收消息,但它仍然有局限性——它不能基于多个条件进行路由.本节我们就进行能够基于多个条件进行路由的topics exchange学习. ...