将单列集合中的元素进行去重以及排序的思路
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是采用红黑树(自平衡二叉树)来实现的。