补充上一日: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. An attempt was made to call the method com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder; but it does not exist. Its class, com.google.gson.GsonBuilder, is available from the foll

    SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/G:/sharp/repo ...

  2. 最近学习总结 Nodejs express 获取url参数,post参数的三种方式

    express获取参数有三种方法:官网实例: Checks route params (req.params), ex: /user/:id Checks query string params (r ...

  3. Java笔记--常用类

    1.String类: --使用Unicode字符编码,一个字符占两个字节: --String类是一个final类,代表不可变的字符序列: --字符串是不可变的,一个字符串对象一旦被配置,其内容是不可变 ...

  4. vue打包部署(含2.0)

    到这里vue的所有平时使用的知识点都写完了 先补充一下vue2.x的安装 ## 全局脚手架 npm install vue/cli -g ## 查看版本 vue --version ## 新建项目 v ...

  5. Java中数组的创建

    Java中数组的使用 1.普通数组变量的定义: //数组 //1.数组是Java中很重要的一部分,今天对数组进行了大致的了解,Java中的数组和C中数组还是有一定的区别的 //以下是总结的几种方法 p ...

  6. 011.Oracle数据库分页,取前10条数据

    SELECT ATA FROM LM_FAULT WHERE ( OCCUR_DATE BETWEEN to_date( '2017-05-01', 'yyyy-MM-DD' ) AND to_dat ...

  7. 1.Maven分模块,分工程管理,多Web应用合并war包

    Eclipse 创建Maven工程 修改POM文件   Eclipse 创建Module工程 以此类推,创建Maven 的Modules web工程goodsmgrweb,创建Maven的Module ...

  8. unity基础开发----Unity获取PC,Ios系统的mac地址等信息

    在软件开发中可以会用到mac地址作为,设备的唯一标示,我们也可以通过unity获取,经测试pc,ios都可以但是安卓没有获取到. 代码如下: using UnityEngine; using Syst ...

  9. S7-300 实训3 异步电机正反转控制

    含有视频 方便以后查阅 参考书籍 跟我动手学 S7-300/400 PLC 第2版  廖常初 主编 实训3 异步电动机 正反转控制 步骤1 步骤2 在 cycle execution 前方 右击 插入 ...

  10. 每天一点点之 uni-app 框架开发 - 页面滚动到指定位置

    项目需求:在页面中,不管位于何处,点击评论按钮页面滚动到对应到位置 实现思路如下: uni.createSelectorQuery().select(".comment").bou ...