无序的有重复数据的list变成有序的无重复数据的list

来源:互联网 发布:js foreach return 编辑:程序博客网 时间:2024/05/22 01:39

将会遇到的问题:

1set是不重复的,但是new出来的数据是否能保证不重复?

2hashset为什么会自动排序呢?

说明:list是有序的(是指的保留其初始化的顺序),不代表初始化是有序的


示例:

1、 首先创建一个无序有重复数据的list

list内容打印出来为:1 5 8 9 2 4 6 5 7 3 3 3 1 1,

说明:其中最后两个1是new出来的

2、  将list转化为set,

    a、list的顺序消失

    b、list的数据缺损,剔除重复的数据

    c、set有三种方式:hashset无序;treeset自动按照从小到大排序,不保留list的顺序;linkedhashset会保留list的顺序

set内容打印出来为:

Set set = new HashSet();set.addAll(list);
HashSet打印内容为:[1, 2, 3, 4, 5, 6, 7, 8, 9]

TreeSet打印内容为:[1, 2, 3, 4, 5, 6, 7, 8, 9]//正序
LinkedHashSet打印内容为:[1, 5, 8, 9, 2, 4, 6, 7, 3]//保留list的顺序

set详解:在java语言中,提供多种不同的结构来组织对象,Set(集合)是其中的一种,本身是一个接口,其迭代时的顺序取决于其具体实现。
典型的实现包括:
HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;
LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代; 
TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。

3、  将set转化为list

注:需先清空list,不然下次把set元素加入此list的时候是在原来的基础上追加元素的   


解决问题:

1、set是不重复的,但是new出来的数据是否能保证不重复

 a)用整数Integer尝试,set可以将重复数据剔除,即使是new出来的数据也能保证不重复

 b)用字符串去尝试:set可以将重复数据剔除,即使是new出来的数据也能保证不重复

2hashset自动排序的表象:

这样并不是按照Set内容进行排序的,他们的顺序取决于hashCode,只是Integer的hashCode刚刚好用的是Integer的value,结果看起来就过排序了。如果是其他hashCode计算方式就不一定了。


0 0