热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

Java底层基于二叉搜索树实现集合和映射/集合Set功能详解

这篇文章主要介绍了Java底层基于二叉搜索树实现集合和映射集合Set功能,结合实例形式分析了Java使用二叉搜索树实现集合和映射相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java底层基于二叉搜索树实现集合和映射功能。分享给大家供大家参考,具体如下:

前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可。在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的集合(set)这种数据结构。
集合set的特性:
集合Set存储的元素是无序的、不可重复的。为了能达到这种特性就需要寻找可以作为支撑的底层数据结构。
这里选用之前自己实现的二叉搜索树,这是由于该二叉树是不能盛放重复元素的。因此我们可以使用二叉搜索树这种底层来实现集合(set)。

1、集合set相关功能

1.1 add()方法特性

二分搜索树的添加操作add:不能盛放重复元素

2. set应用

典型应用:1.客户统计 2.词汇量统计

3.集合实现

3.1 Set接口定义

/**
 * 集合的接口
 */
public interface Set {
  void add(E e);//添加 <——<不能添加重复元素
  void remove(E e);//移除
  int getSize();//获取大小
  boolean isEmpty();//是否为空
  boolean contains(E e);//是否包含元素
  
}

3.2 基于二分搜索树实现集合Set

//基于BST二分搜索树实现的集合Set
public class BSTSet> implements Set {//元素E必须满足可比较的
 
  //基于BST类的对象
  private BST bst;
 
  //构造函数
  public BSTSet() {
    bst = new BST<>();
  }
 
  //返回集合大小
  @Override
  public int getSize() {
    return bst.size();
  }
 
  //返回集合是否为空
  @Override
  public boolean isEmpty() {
    return bst.isEmpty();
  }
 
  //Set添加元素
  @Override
  public void add(E e) {
    bst.add(e);
  }
 
  //是否包含元素
  @Override
  public boolean contains(E e) {
    return bst.contains(e);
  }
 
  //移除元素
  @Override
  public void remove(E e) {
    bst.remove(e);
  }
}

3.3测试:两本名著的词汇量 和不重复的词汇量

public static void main(String[] args) {
 
    System.out.println("Pride and Prejudice");
    //新建一个ArrayList存放单词
    ArrayList words1=new ArrayList<>();
    //通过这个方法将书中所以单词存入word1中
    FileOperation.readFile("pride-and-prejudice.txt",words1);
    System.out.println("Total words : "+words1.size());
 
    BSTSet set1=new BSTSet<>();
    //增强for循环,定一个字符串word去遍历words
    //底层的话会把ArrayList words1中的值一个一个的赋值给word
    for(String word:words1)
      set1.add(word);//不添加重复元素
    System.out.println("Total different words : "+set1.getSize());
 
    System.out.println("-------------------");
    System.out.println("Pride and Prejudice");
    //新建一个ArrayList存放单词
    ArrayList words2=new ArrayList<>();
    //通过这个方法将书中所以单词存入word1中
    FileOperation.readFile("a-tale-of-two-cities.txt",words2);
    System.out.println("Total words : "+words2.size());
 
    BSTSet set2=new BSTSet<>();
    //增强for循环,定一个字符串word去遍历words
    //底层的话会把ArrayList words1中的值一个一个的赋值给word
    for(String word:words2)
      set2.add(word);//不添加重复元素
    System.out.println("Total different words : "+set2.getSize());
  }

结果:

这里需要说明一下就是关于我们统计的单词数只考虑了每个单词组成的不用,并没有对单词的特殊形式做区分。

在下一小节中继续学习【集合和映射--集合Set->底层基于链表实现】。

源码地址 https://github.com/FelixBin/dataStructure/tree/master/src/SetPart

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


推荐阅读
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文基于对相关论文和开源代码的研究,详细介绍了LOAM(激光雷达里程计与建图)的工作原理,并对其关键技术进行了分析。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
author-avatar
彭彭宅男丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有