将单列集合中的元素进行去重以及排序的思路

Collection是单列的一个接口,其下两大分支的是List和Set,其中List 的特点是有序允许重复,Set的特点是无序且不允许重复,在我们使用完List的具体类实现完数据添加的时候,我们如果相对数据进行去重或者排序应该如何处理呢?给出以下几种思路:

   第一种方法:采用遍历方式

创建一个新集合,遍历旧集合中的元素,使用Contains方法 看看新集合中 是否包含此旧集合中的元素,不包含就添加至新集合中。

       第二种方法:巧用构造函数

创建一个HashSet或者TreeSet类,查看TreeSet源码构造函数如下:

    public TreeSet(Collection<? extends E> c) {

        this();

        addAll(c);

}

 

HashSet的构造函数如下,相对来说麻烦一点,这是因为HashSet底层维护了一个HashMap.

 

    public HashSet(Collection<? extends E> c) {

        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));

        addAll(c);

    }

 我们发现其构造方法定义的是Collection接口,这也就说明我们再传参的时候可以传递任意Collection接口的实现类,包括List和Set的实现类,代码如下:

        List<String> col  = new ArrayList<String>();

        col.add("br23r");

        col.add("ar23r2");

        col.add("3r233");

        col.add("2r23r");

        col.add("2r23r");//跟上一个重复,观察是否去重

       

        Set<String> set = new TreeSet<String>(col);

       

    System.out.println(set);//观察是否排序及去重

输出如下:

 

 

 

实验成功。

 

 

后记:

  如果ArrayList种装载的是某种自己写的类,在对其进行去重时要重写其HashCode方法跟equals方法,因为Set里的元素是无序的,其存储时是用内部的数据结构对其进行存储,其判断条件就是HashCode方法跟equals方法,顺便一提,HashSet是按照哈希值存储,LinkedHashSet是按照一个链表用于存储顺序,哈希表用于内部储存,TreeSet是采用红黑树(自平衡二叉树)来实现的。

posted @ 2019-10-22 21:18  ForrestGump01  阅读(321)  评论(0编辑  收藏  举报