首页 > 其他分享 >第11章. 集合(Set)

第11章. 集合(Set)

时间:2023-12-06 20:57:02浏览次数:36  
标签:11 Set void list element Override 集合 public

集合(Set)


一、集合的特点

集合的特点:

  1. 不存放重复的元素
  2. 常用于去重

二、集合的实现方式

思考:集合的内部实现是否能直接利用以前学过的数据结构?

  • 动态数组
  • 链表
  • 二叉搜索树(AVL树、红黑树)

三、集合的接口实现

public interface Set<E> {
    int size();
    boolean isEmpty();
    void clear();
    boolean contains(E element);
    void add(E element);
    void remove(E element);
    void traversal(Visitor<E> visitor);
    
    abstract class Visitor<E> {
        boolean stop;
        public abstract boolean visist(E element);
    }
}

四、链表实现集合(ListSet)

package DataStructure._06集合;

import java.util.LinkedList;
import java.util.List;

/**
 * @author keyongkang
 * @create 2022-08-12-15:53
 */
public class ListSet<E> implements Set<E> {

    // 双向链表实现集合
    private List<E> list = new LinkedList<>();

    /**
     * 返回集合的大小
     * @return
     */
    @Override
    public int size() {
        return list.size();
    }

    /**
     * 判断集合是否为空
     * @return
     */
    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    /**
     * 清空集合
     */
    @Override
    public void clear() {
        list.clear();
    }

    /**
     * 判断集合是否包含某个元素
     * @param element
     * @return
     */
    @Override
    public boolean contains(E element) {
        return list.contains(element);
    }

    /**
     * 向集合中添加元素,如果元素不存在,则直接添加;如果元素存在,则覆盖
     * @param element
     */
    @Override
    public void add(E element) {
        if (!list.contains(element)) {
            list.add(element);
        } else {
            int index = list.indexOf(element);
            // 将新值覆盖旧值
            list.set(index, element);
        }
    }


    /**
     * 向集合中移除元素
     * @param element
     */
    @Override
    public void remove(E element) {
        if (list.contains(element)) {
            list.remove(element);
        }
    }


    /**
     * 遍历集合
     * @param visitor
     */
    @Override
    public void traversal(Visitor<E> visitor) {
        if (visitor == null) return;

        int size = list.size();
        for (int i = 0; i < size; i ++) {
            if (visitor.visist(list.get(i))) return;
        }
    }
}

添加、删除、搜索的时间复杂度都是O(n)。

五、红黑树实现集合(TreeSet)

package DataStructure._06集合;

import DataStructure._03二叉树.tree.RBTree;

/**
 * @author keyongkang
 * @create 2022-08-12-16:22
 */
public class TreeSet<E> implements Set<E> {

    // 红黑树实现集合
    private RBTree<E> tree = new RBTree<>();
    
    public TreeSet() {
        this(null);
    }
    
    public TreeSet(Comparable<E> comparator) {
        tree = new RBTree<>(comparator);
    }

    @Override
    public int size() {
        return tree.size();
    }

    @Override
    public boolean isEmpty() {
        return tree.isEmpty();
    }

    @Override
    public void clear() {
        tree.clear();
    }

    @Override
    public boolean contains(E element) {
        return tree.contains(element);
    }

    @Override
    public void add(E element) {
        tree.add(element);
    }

    @Override
    public void remove(E element) {
        tree.remove(element);
    }

    @Override
    public void traversal(Visitor<E> visitor) {
        
    }
}

添加、删除、搜索的时间复杂度都是O(logn)。

六、TreeSet的局限性

使用二叉搜索树(红黑树)来实现集合的话,有一个限制:元素必须具备可比较性。(源自二叉搜索树的性质)

所以当TreeSet中要存入自己实现的类作为元素时,该类必须实现Comparable接口或者在创建Set时传入一个该类的Comparator比较器

七、Map与Set

Map的所有key组合在一起,其实就是一个Set。

因此,Set可以间接利用Map来作为内部实现。

map.put(element,null);

八、TreeMap实现TreeSet

如果Map去掉value,只保留key。那么Map就变为了Set。

九、Java官方的TreeSet

Java官方的TreeSet的内部实现使用的是TreeMap。

标签:11,Set,void,list,element,Override,集合,public
From: https://www.cnblogs.com/keyongkang/p/17880510.html

相关文章

  • HC32L110+spi 调试SX1268
    1.官网下载例程https://www.xhsc.com.cn/Productlist/info.aspx?itemid=17512.找到spi例程开始暴改改动1.en_result_tSpi_SendData(uint8_tu8Data){    uint32_tu32TimeOut;        u32TimeOut=1000;    M0P_SPI->DATA=u8Data;        wh......
  • VS2019编译PCL1.11.1源码
    最近在使用PCL的体素滤波器进行点云降采样时,遇到了 Leafsizeistoosmallfortheinputdataset的报错,出于某些原因,并不想简单的增大Leafsize来解决这个问题。尝试修改了PCL的源码,但是很可惜,对源码的改动并不能直接应用到我的项目中,于是只能被迫对PCL的sourcecode进行......
  • appsettings.json和appsettings.Development.json
    在ASP.NETCore中,当应用程序处于开发环境时,默认情况下会加载appsettings.json和appsettings.Development.json文件中的配置,并且appsettings.Development.json中的配置会覆盖appsettings.json中的相同配置。这是ASP.NETCore提供的一种便捷的配置管理机制。如果你希......
  • 基于 alientek rv1126 快速启动调试那的写坑
    基于alientekrv1126快速启动调试那的写坑1.sdk编制准备工作1.1编译配置修改首先拿到sdk通过修改一下相关配置1.1.1修改DDR配置cd/home/alientek/rv1126/rkbin/RKBOOTviRV1126MINIALL_EMMC_TB.ini​ 修改相关内容如下[CHIP_NAME]NAME=RV1126[VERSION]......
  • 文心一言 VS 讯飞星火 VS chatgpt (130)-- 算法导论11.2 2题
    二、用go语言,对于一个用链接法解决冲突的散列表,说明将关键字5,28,19,15,20,33,12,17,10插入到该表中的过程。设该表中有9个槽位,并设其散列函数为h(k)=kmod9。文心一言:在这个问题中,我们使用Go语言来解决一个散列(Hash)表的问题,该问题需要我们使用链接法解决冲突。我们的散列......
  • 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题
    四、用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典。开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储对象占用O(1)空间;SEARCH、INSERT和DELETE操......
  • 自行回顾所用(如:setTimeout、nextTick、await等)
    自行回顾所用setTimeout()setTimeout()是一个JavaScript函数,它用于在特定的时间后执行一段代码。这个函数需要两个参数:一个是要执行的函数,另一个是延迟的毫秒数setTimeout(()=>{...},delay)中的delay是延迟的毫秒数,表示在多少毫秒后执行传入的函数。例如,如果你设置......
  • Y112S打印机
    Y112S打印机打印机参数分辨率:8点/mm,384点/行有效打印宽度:48mm每列网格数:8个,40mm,每个波形占一半进纸步距(点距):0.125mm网格:5mm*5mm,打印机按照整数个网格打印缓存网格GRIDlength:5mm点数:4025mm/s->0.2s/GRID50mm/s->0.1s/GRID配置1.速率25mm/s50mm/s2.模式......
  • k3s突破单节点pod数量110限制
    k3s突破pod数量110限制新增kubelet.config配置文件​vim/etc/rancher/k3s/kubelet.config​输入如下内容apiVersion:kubelet.config.k8s.io/v1beta1kind:KubeletConfigurationmaxPods:1024allowedUnsafeSysctls:-"net.*"编辑/etc/systemd/system/k3s.service,更......
  • k3s突破单节点pod数量110限制
    k3s突破pod数量110限制新增kubelet.config配置文件​vim/etc/rancher/k3s/kubelet.config​输入如下内容apiVersion:kubelet.config.k8s.io/v1beta1kind:KubeletConfigurationmaxPods:1024allowedUnsafeSysctls:-"net.*"编辑/etc/systemd/system/k3s.service,更......