DS-Set

定义接口

public interface SelfSet<T> {
    void add(T t);

    void remove(T t);

    boolean isContains(T t);

    int size();

    boolean isEmpty();

    /**
     * 将set元素放入list中
     */
    List<T> dataList();
}

数组实现

底层使用数组作为容器: DS-数组


/**
 * 以数组为set底层数据结构
 *
 * @author Deevan
 */
public class ArraySet<T> implements SelfSet<T> {

    /**
     * 声明数据容器
     */
    MySelfArray<T> data;

    public ArraySet() {
        data = new MySelfArray<>();
    }

    @Override
    public void add(T t) {
        if (data.isContains(t) == -1) {
            data.addTail(t);
        }
    }

    @Override
    public void remove(T t) {
        data.removeEle(t);
    }

    @Override
    public boolean isContains(T t) {
        return data.isContains(t) != -1;
    }

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

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

    /**
     * 将set元素放入list中
     *
     * @return list
     */
    @Override
    public List<T> dataList() {
        List<T> list = new ArrayList<>();
        T[] result = data.getData();
        list = Arrays.stream(result).collect(Collectors.toList());
        return list;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        T[] result = data.getData();
        for (int i = 0; i < data.getSize(); i++) {
            sb.append(result[i]);
            if (i != data.getSize() - 1) {
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}

链表实现

底层使用链表作为容器: DS-链表

/**
 * 底层为链表
 *
 * @author Deevan
 */
public class LinkedSet<T> implements SelfSet<T> {

    /**
     * 声明底层容器
     */
    MyLink<T> data;

    public LinkedSet() {
        data = new MyLink<>();
    }

    @Override
    public void add(T t) {
        if (!data.isContains(t)) {
            data.addTail(t);
        }
    }

    @Override
    public void remove(T t) {
        data.removeByVal(t);
    }

    @Override
    public boolean isContains(T t) {
        return data.isContains(t);
    }

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

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

    @Override
    public List<T> dataList() {
        List<T> list = new ArrayList<>();
        for (int i = 0; i < data.getSize(); i++) {
            list.add(data.get(i));
        }
        return list;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < data.getSize(); i++) {
            sb.append(data.get(i)).append(",");
        }
        sb.replace(sb.length() - 1, sb.length(), "]");
        return sb.toString();
    }
}

二分搜索树实现

底层使用二分搜索树作为容器: DS-二分搜索树

元素必须具有可比性

输出采用中序遍历(递增)

增删改的时间复杂度为树的高度 O(logn)

/**
 * 二分搜索树实现set
 *
 * @author Deevan
 */
public class STreeSet<T extends Comparable<T>> implements SelfSet<T> {
    BinarySearch<T> data;

    public STreeSet() {
        data = new BinarySearch<>();
    }

    @Override
    public void add(T t) {
        if (data.contains(t) == null) {
            data.add(t);
        }
    }

    @Override
    public void remove(T t) {
        data.removeNode(t);
    }

    @Override
    public boolean isContains(T t) {
        return data.contains(t) != null;
    }

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

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

    @Override
    public List<T> dataList() {
        return data.middleOrder();
    }

    /**
     * 使用二分搜索树的中序遍历
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        for (T t : data.middleOrder()) {
            sb.append(t).append(",");
        }
        sb.replace(sb.length() - 1, sb.length(), "]");
        return sb.toString();
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EnndmeRedis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值