美文网首页数据结构数据结构和算法分析
6.2 集合和映射--集合Set->底层基于链表实现

6.2 集合和映射--集合Set->底层基于链表实现

作者: wfaceboss | 来源:发表于2019-04-16 13:20 被阅读0次

    在6.1中我们实现了底层基于二叉搜索树的集合,本节就底层如何基于链表实现进行学习, 注意:此处的链表是之前自己封装的

    1、集合set相关功能

    image.png
    1.1 add()的不同

    用于链表本身没有去重的效果,因此我们在做基于链表的集合时,需要对add()方法做一下特殊处理,如下增加一个判断即可。

     @Override
        public void add(E e) {
            if (!list.contains(e)) {
                list.addFirst(e);
            }
        }
    

    2.集合实现

    2.1 Set接口定义
    /**
     * 集合的接口
     */
    public interface Set<E> {
        void add(E e);//添加  <——<不能添加重复元素
        void remove(E e);//移除
        int  getSize();//获取大小
        boolean isEmpty();//是否为空
        boolean contains(E e);//是否包含元素
        
    }
    
    3.2 基于链表实现集合Set
    public class LinkedListSet<E> implements Set<E> {
    
        private LinkedList<E> list;
    
    
        public LinkedListSet() {
            list = new LinkedList<E>();
        }
    
    
        @Override
        public int getSize() {
            return list.getSize();
        }
    
        @Override
        public boolean isEmpty() {
            return list.isEmpty();
        }
    
        @Override
        public boolean contains(E e) {
            return list.contains(e);
        }
    
        @Override
        public void add(E e) {
            if (!list.contains(e)) {
                list.addFirst(e);
            }
        }
    
    
        @Override
        public void remove(E e) {
            list.removeElement(e);
        }
    }
    
    3.3测试:两本名著的词汇量 和不重复的词汇量
    import java.util.ArrayList;
    
    public class LinkedListSetTestDemo {
        public static void main(String[] args) {
    
            System.out.println("Pride and Prejudice");
            //新建一个ArrayList存放单词
            ArrayList<String> words1 = new ArrayList<>();
            //通过这个方法将书中所以单词存入word1中
            FileOperation.readFile("pride-and-prejudice.txt", words1);
            System.out.println("Total words : " + words1.size());
    
            LinkedListSet<String> set1 = new LinkedListSet<>();
            //增强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<String> words2 = new ArrayList<>();
            //通过这个方法将书中所以单词存入word1中
            FileOperation.readFile("a-tale-of-two-cities.txt", words2);
            System.out.println("Total words : " + words2.size());
    
            LinkedListSet<String> set2 = new LinkedListSet<>();
            //增强for循环,定一个字符串word去遍历words
            //底层的话会把ArrayList words1中的值一个一个的赋值给word
            for (String word : words2)
                set2.add(word);//不添加重复元素
            System.out.println("Total  different words : " + set2.getSize());
    
        }
    }
    

    结果:


    image.png

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

    点赞是最好的支持,关注是最大的鼓励。亲爱的朋友,很荣幸在简书遇到您。

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

    相关文章

      网友评论

        本文标题:6.2 集合和映射--集合Set->底层基于链表实现

        本文链接:https://www.haomeiwen.com/subject/uhqbwqtx.html