当前位置: 首页 > news >正文

黑马程序员_Set,TreeSet

--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------


1.TreeSet

1. 概述

TreeSet本身对元素记性排序,要是自定的类,那么要是此类对象存数TreeSet中,那么就必须是S自定义的类本身具备比较性,那么据必须实现接口Comparable,并重写方法compareTo()方法,底层数据结构是二叉树

compareTo()返回值是整数,如果小于0,那么此对象就小于比较的对象,等于0,那么此对象就等于比较的对象,如果大于0,那么此对象就大于比较的对象。

2. 自然排序规则(Comparable)

有的对象在存储到TreeSet本身就具备可比性,例如:String类,是要找ASCII大小比较的,那么我们就以自定义的类来存储TreeSet中,使其具备可比性。


package www.fuxi.jihe;
//自定义的异常
public class RunntimeNoStudentExceptionextends RuntimeException {
    publicRunntimeNoStudentException(String message){
      super(message);
    }
}
 
package www.fuxi.jihe;
 
public class Student implements Comparable {
   private String name;// 姓名
   private int age;// 年龄
  
   public Student(Stringname, int age) {
     super();
     this.name = name;
     this.age = age;
   }
 
   public String getName() {
     return name;
   }
 
   public int getAge() {
     return age;
   }
 
   public int compareTo(Object o) {
     if(!(o instanceof Student))
        throw new RunntimeNoStudentException("不是Student对象");
     Student stu=(Student)o;
     if(this.name.equals(stu.name)){
        return this.age-stu.age;
     }
     return this.name.compareTo(stu.name);
   }
 
}
package www.fuxi.jihe;
 
import java.util.Iterator;
import java.util.TreeSet;
 
public class TreeSetDemo {
   public static void main(String[]args) {
     TreeSet set=new TreeSet();
     set.add(new Student("zhangsan",22));
     set.add(new Student("zhangsan",23));
     set.add(new Student("zhangsan",22));
     set.add(new Student("lisi",25));
     Iterator it=set.iterator();
     while(it.hasNext()){
        Student stu=(Student)it.next();
        System.out.println(stu.getName()+":"+stu.getAge());
     }
   }
 
}
 
结果:
lisi:25
zhangsan:22
zhangsan:23
 


从结果可以看出,如果名字相同,则比较年龄,如果年龄也相同,那么对象就相同了,此不存入此对象。

3. 模拟二叉树

package www.fuxi.jihe;
 
class ErChaShu {
   class Node {
     private Comparable data;
     private Node left;
     private Node right;
 
     public Node(Comparable data) {// 构造方法初始化数据
        this.data = data;
     }
 
     public void addNode(Node newNode) {
        if (newNode.data.compareTo(this.data) < 0) {// 利用compareTo方法比较
          if (this.left == null) {// 判断是否放在左子树
             this.left = newNode;
          } else {
             this.left.addNode(newNode);
          }
        }
        if (newNode.data.compareTo(this.data) >= 0) {// 判断是否放在右子树
          if (this.right == null) {
             this.right = newNode;
          } else {
             this.right.addNode(newNode);
          }
        }
 
     }
 
     public void printNode() {// 输出元素,中序遍历
        if (this.left != null) {
          this.left.printNode();// 输出左子树
        }
        System.out.print(this.data + "\t");
        if (this.right != null) {
          this.right.printNode();
        }
     }
   }
 
   private Node root = null;// 存放根节点
 
   public void add(Comparable com) {// 加入新元素
     Node newNode = new Node(com);// 定义新结点
     if (this.root == null) {
        this.root = newNode;
     } else {
        this.root.addNode(newNode);// 判断是放在左子树还是右子树
     }
   }
 
   public void print() {// 输出新结点
     this.root.printNode();
   }
}
 
public class TextClass {
   public static void main(String[] agrs) throws Exception {
     ErChaShu t = new ErChaShu();
     t.add(4);// 添加元素
     t.add(2);
     t.add(0);
     t.add(7);
     t.add(9);
     t.add(8);
     t.print();// 输出元素
   }
}
 
结果:
0  2  4  7  8  9 


4. 自定义比较器(Comparator)

除了第一种比较方式,自然的排序,是对象本身具备比较性,还有另一种比较方式,那就是使集合具备比较性,那就是自定义比较器,把比较器通过构造方式传给集合,使集合剧本比较性。

步骤:定义一个类,实现接口Comparator,然后重写方法compare方法。

当比较器和自定义的自然排序同时存在的时候,那么就一比较器为主。


public class RunntimeNoStudentException extends RuntimeException {
    publicRunntimeNoStudentException(String message){
      super(message);
    }
}
public class Person {
   private String name;// 姓名
   private int age;// 年龄
 
   public Person(String name, int age) {
     super();
     this.name = name;
     this.age = age;
   }
 
   public String getName() {
     return name;
   }
 
   public int getAge() {
     return age;
   }
 
  
}
import java.util.Comparator;
 
public class MyCompartor implements Comparator {
 
   public int compare(Object o1, Object o2) {//从写此方法
     if(!(o1 instanceof Person || o2 instanceof Person)){
         throw newRunntimeNoStudentException("不是Person对象");
     }
     Person p=(Person)o1;
     Person p1=(Person)o2;
     int num=p.getName().compareTo(p1.getName());
     if(num==0)
        return p.getAge()-p1.getAge();
     return num;
   }
 
}
package www.fuxi.jihe;
 
import java.util.Iterator;
import java.util.TreeSet;
 
public class TreeSetDemo {
   publicstatic void main(String[] args) {
    
     TreeSetset = new TreeSet(new MyCompartor());
     set.add(newPerson("java03", 22));
     set.add(newPerson("java01", 23));
     set.add(newPerson("net07", 22));
     set.add(newPerson("net03", 25));
     Iteratorit = set.iterator();
     while(it.hasNext()) {
        Personstu = (Person) it.next();
        System.out.println(stu.getName()+ ":" + stu.getAge());
     }
   }
 
}
结果:
java01:23
java03:22
net03:25
net07:22
 


从结果可以看出,先是按照名字排序,然后按照年龄排序。

5. 练习

自定义比较器,存储字符串,字符串按照长度大小排序

import java.util.Comparator;
 
public class MyStringCompartor implements Comparator {
 
  public int compare(Object o1, Object o2) {//从写此方法
    if(!(o1 instanceof String|| o2 instanceof String)){
       throw newRunntimeNoStudentException("不是String的子类或者Person对象");
    }
    Strings1=(String)o1;
    Strings2=(String)o2;
    return s1.length()-s2.length();
  }
 
}
importjava.util.Iterator;
importjava.util.TreeSet;
 
publicclass TreeSetDemo {
public static void main(String[] args) {
  
   TreeSet set = new TreeSet(new MyStringCompartor());
   set.add("abcd");
   set.add("ad");
   set.add("cdf");
   set.add("a");
   set.add("abcdfrr");
   Iterator it = set.iterator();
   while (it.hasNext()) {
     System.out.println(it.next());
   }
}
 
}
结果:
a
ad
cdf
abcd
abcdfrr
 
 

-------------------- ASP.Net+Android+IOS开发 .Net培训 、期待与您交流! --------------------

相关文章:

  • ios开发之你真的了解了KVC吗?
  • 快速排序算法
  • C# 网络编程之webBrowser乱码问题及解决知识
  • Python 入门教程 8 ---- Python Lists and Dictionaries
  • linux上安装RAC时不使用asmlib的多路径配置
  • HDOJ, 杭电1219, ACme简单字符串题
  • Java RandomAccessFile
  • Sass的准备工作有哪些
  • oracle RAC 10g 升级到11g (out of place) 回退方案
  • 个人站长的生存空间是否越来越小?
  • 弥补两个不足来提升企业站流量
  • 中国象棋程序的设计与实现(高级版)(2012本科毕业论文等重要文档资料)
  • linux arping命令学习
  • linux的多任务编程-线程池
  • 裸设备上的oracle文件备份-----HP-UX下oracle的裸设备大小
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Android系统模拟器绘制实现概述
  • Fabric架构演变之路
  • jQuery(一)
  • leetcode388. Longest Absolute File Path
  • linux学习笔记
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Wamp集成环境 添加PHP的新版本
  • 大数据与云计算学习:数据分析(二)
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 经典排序算法及其 Java 实现
  • 跳前端坑前,先看看这个!!
  • Hibernate主键生成策略及选择
  • 阿里云API、SDK和CLI应用实践方案
  • 从如何停掉 Promise 链说起
  • (6)添加vue-cookie
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (LeetCode C++)盛最多水的容器
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (九)c52学习之旅-定时器
  • (未解决)macOS matplotlib 中文是方框
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • *** 2003
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net生成的类,跨工程调用显示注释
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [20160807][系统设计的三次迭代]
  • [AIGC] Spring Interceptor 拦截器详解
  • [C++]高精度 bign (重载运算符版本)
  • [CISCN 2023 初赛]go_session
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [hive] 窗口函数 ROW_NUMBER()
  • [IE9] IE9 beta版下载链接
  • [J2ME]如何替换Google Map静态地图自带的Marker
  • [Json.net]快速入门
  • [Linux](15)线程基础,线程控制,线程的互斥与同步