集合(JAVA)

本文介绍了JAVA中集合的三种实现方式:基于二分搜索树的集合,强调元素的可比较性;基于链表的集合,添加元素时需处理重复;以及基于数组的集合,存在一些未解决的bug问题。
摘要由CSDN通过智能技术生成

集合是一种元素不重复的容器

/**
 * 集合的主要特点:元素不重复
 * @param <E>
 */
public interface Set<E> {

    /**
     * 添加
     * @param e
     */
    void add(E e);

    /**
     * 判断是否存在
     * @param e
     * @return
     */
    boolean contains(E e);

    /**
     * 删除
     * @param e
     */
    void remove(E e);

    /**
     * 元素个数
     * @return
     */
    int getSize();

    /**
     * 是否为空
     * @return
     */
    boolean isEmpty();

}

基于二分搜索树的集合

/**
 * 基于二分搜索树的集合
 * @param <E>
 */
public class BSTSet<E extends Comparable<E>> implements Set<E> {

    private BST<E> bst;

    public BSTSet() {
        bst = new BST<>();
    }

    @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);
    }

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

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

}

需要特别注意:这里使用的二分搜索树相应的也是去重的,而且因为二分搜索树需要元素具有可比较性,相应的集合元素也应具有该性质。

基于链表的集合

import java.util.LinkedList;

public class LinkedSet<E> implements Set<E> {

    private LinkedList<E> linkedList;

    public LinkedSet() {
        linkedList = new LinkedList<>();
    }

    @Override
    public void add(E e) {
        if (contains(e)) {
            return;
        }
        linkedList.add(e);
    }

    @Override
    public boolean contains(E e) {
        return linkedList.contains(e);
    }

    @Override
    public void remove(E e) {
        linkedList.remove(e);
    }

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

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

这里用的链表是java中的链表,也可以使用自定义的链表,需要注意的是在添加元素时需要处理重复的情况。

基于数组的集合

public class ArraySet<E> implements Set<E> {

    private E[] array;

    private int size;

    public ArraySet() {
        array = (E[]) new Object[10];
        size = 0;
    }

    @Override
    public void add(E e) {
        if (contains(e)) {
            return;
        }
        array[size++] = e;
    }

    @Override
    public boolean contains(E e) {
        return indexOf(e) != -1;
    }

    private int indexOf(E e) {
        for (int i = 0; i < size; i++) {
            if (array[i].equals(e)) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public void remove(E e) {
        int removeIndex = indexOf(e);
        for (int i = removeIndex; i < size; i++) {
            array[i] = array[i + 1];
        }
        if (removeIndex == -1) {
            return;
        }
        size--;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }
    
}

这里没有使用增强的数组,所以里边有一堆bug

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值