补充上一日: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. No 'Access-Control-Allow-Origin'跨域问题- (mysql-thinkphp) (6)

    因为ajax请求一个服务的时候,服务器端,比如thinkphp端,或者java框架,它会检测,你请求时候的域名,就是http请求的时候,request header不是会把客户端的Request UR ...

  2. GDI4

    前几篇我已经向大家介绍了如何使用GDI+来绘图,并做了一个截图的实例,这篇我向大家介绍下如何来做一个类似windows画图的工具.个人认为如果想做一个功能强大的绘图工具,那么单纯掌握GDI还远远不够, ...

  3. javaboot+es

    说明:可能有些书教你学es的时候,叫你下载什么kibana,crul……之类的也要版本对应,但实际上这些东西写代码不是必须.当时为了搞这些东西花了一天时间.我们用postman也可以写命令的. 正文: ...

  4. EditText标签的使用

    前文: 介绍EditText的使用,这个是文本输入控件,用来输入文本内容 使用: EditText继承TextView所以TextView的东西EditText都可以使用 text:显示文本 text ...

  5. C++ 检测物理内存以及磁盘空间

    BOOL CheckResource() { MEMORYSTATUSEX statex; statex.dwLength = sizeof (statex); GlobalMemoryStatusE ...

  6. nodejs - fs模块 - 文件操作

    1, fs.stat  检测是文件还是目录 2, fs.mkdir 创建目录 var fs = require('fs') fs.mkdir('./dir',function(err){ if(err ...

  7. MSVCRTD.LIB和LIBCMTD.LIB冲突(转载)

    以前经常遇到这个警告信息,因为运行并没有什么问题,所以也没深究.但是耿耿于怀那个“ 0 个错误,0 个警告”的成功提示,在网上搜了一下.原来问题出在默认库的引用选择上. VS2008,项目——属性—— ...

  8. 深入浅出KNN算法

    概述 K最近邻(kNN,k-NearestNeighbor)分类算法 所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. kNN算法的核心思想是如果一个样本在特征 ...

  9. 032-PHP中关于数组排序的usort()函数

    <?php function re($a, $b) { return ($a < $b) ? 1 : -1; } $x = array(1, 3, 2, 5, 9); usort($x, ...

  10. 【转】在C#中?,?:和??

    符号:?名称:可空类型修饰符.引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.为了使值类型 ...