补充上一日: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的更多相关文章

  1. Java提高十七:TreeSet 深入分析

    前一篇我们分析了TreeMap,接下来我们分析TreeSet,比较有意思的地方是,似乎有Map和Set的地方,Set几乎都成了Map的一个马甲.此话怎讲呢?在前面一篇讨论HashMap和HashSet ...

  2. java: Set类及子类:TreeSet有序子类,HashSet无序子类:重复元素

    Set类及子类: TreeSet有序子类: HashSet无序(散列)子类 HashSet子类的内容是没有顺序的,单个元素也不会重复的(对象除外). Set<String> allSet ...

  3. Java集合(6):TreeSet

    一.TreeSet介绍 与HashSet是基于HashMap实现一样,TreeSet是基于TreeMap实现的.TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进 ...

  4. 集合系列 Set(八):TreeSet

    TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现.我们先来看看 TreeSet 的定义. public class TreeSet< ...

  5. Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)

    1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...

  6. Java开发笔记(六十五)集合:HashSet和TreeSet

    对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...

  7. 集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)

    一.集合类 定义:一种为了对多个对象进行操作而进行存储的方式. 1.与数组的区别: 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,数组长度固定. 集合:只能存储对象,长度可变, ...

  8. Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别

    本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSe ...

  9. 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)

    算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...

随机推荐

  1. 201706 Ruby 基础 & 元编程

    yield yield self Proc yield带参数 rails中:yield 和 content_for methods.proc.lambda.block 闭包(用proc延长变量的生命周 ...

  2. 微信小程序语音(A)发给别人(B),也能播放,是需要先把语音上传到自己的服务器上才可以

    小程序语音(A)发给别人(B),也能播放,是需要先把语音上传到自己的服务器上才可以. https://developers.weixin.qq.com/miniprogram/dev/api/medi ...

  3. 将证书添加到受信任的根证书存储失败,出现以下错误:访问控制列表(ACL)结构无效

    问题出现情景: 使用 vs2017 创建一个 ASP.NET Core Web 应用程序 -> Ctrl + F5 运行项目 选择是,但是添加证书失败,是什么原因导致的我不知道,有大佬的知道的话 ...

  4. Python--unique()与nunique()函数

    参考:https://www.cnblogs.com/xxswkl/p/11009059.html 1 unique() 统计list中的不同值时,返回的是array.它有三个参数,可分别统计不同的量 ...

  5. Day4 - H - Following Orders POJ - 1270

    Order is an important concept in mathematics and in computer science. For example, Zorn's Lemma stat ...

  6. 024、Java中字符串连接字符串拼接

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  7. PHP数组——定义,类型,遍历数组,数组函数

    1.定义 $attr=array();                            //标准定义方式 $attr=[1,2]; $attr[0]="hello";     ...

  8. PHP时间格式

    date 用法: date(格式,[时间]); 如果没有时间参数,则使用当前时间.格式是一个字符串,其中以下字符有特殊意义: Y - 年,四位数字; 如: "1999" y - 年 ...

  9. 微信access_token设计的原理解析

    1.access_token是加密的字符串,其目的是为了接口安全考虑,不然随便就能调用微信服务器的接口会有很大风险. 2.用户在公众号中填写的Token就相当于本项目中的xiaoming,是签名验证中 ...

  10. UVA - 1423 Guess (拓扑排序)

    题意:已知矩阵S,求序列a.已知矩阵Sij = “ + ” if ai + . . . + aj > 0; Sij = “ − ” if ai + . . . + aj < 0; and ...