List去重的几种方法

//HashSet是通过Hashcode和equals去重
//Treeset默认是通过自然排序接口去重

//colections.sort() 或者List.sort()不能去重,因为使用的是排序算法(比如jdk6的归并排序,jdk7的二叉排序)

@Test
public void test1() {

List lists = Arrays.asList(“aa”, “a”, “AA”, “aa”, “bb”, “cc”,
“ss”, “ss”);
List lists2 = new ArrayList();
// 方式1:遍历每个元素,使用新集合添加的时候进行重复判断 保持了原来的顺序
for (String s1 : lists) {
if (!lists2.contains(s1)) {
lists2.add(s1);
}
}
//为了避免内存浪费
lists=null;
System.out.println(lists2);

}

@Test
public void test2() {
//保留了原来的排序
List lists = Arrays.asList(“aa”,“a”,“AA”,“aa”,“bb”,“cc”,“ss”,“ss”,“ss”,“aa”,“aa”);
//因为:Arrays.asList()返回一个受指定数组支持的固定大小的列表。所以不能做Add、Remove等操作。
lists=new ArrayList(lists);
for (int i = 0; i < lists.size()-1; i++) {
for (int j =lists.size()-1 ; j >i; j–) {
if (lists.get(i).equals(lists.get(j))) {
lists.remove(j);
}
}
}
// 或者
// for (int i = 0; i < lists.size()-1; i++) {
// for (int j = i+1; j < lists.size(); j++) {
// if (lists.get(i).equals(lists.get(j))) {
// //注意在删除时有一个顶替的过程
// lists.remove(j);
// j–;
// }
// }
// }
System.out.println(lists);
}

@Test
public void test3() {
List lists = Arrays.asList(“aa”,“a”,“AA”,“aa”,“bb”,“cc”,“ss”,“ss”);

//使用TreeSet的排序去重,结果是排序之后的
// lists=new ArrayList(new TreeSet(lists));
// System.out.println(“去重1:”+lists);

//使用HashSet的排序去重,结果是排序是随机的
// lists=new ArrayList(new HashSet(lists));
// System.out.println(“去重2:”+lists);

// 使用LinkedHashSet的排序去重,结果是原来的排序 (推荐)
lists=new ArrayList(new LinkedHashSet(lists));
System.out.println(“去重3:”+lists);

}

// 使用Collections.frequency ,看底层源码,他会统计每个元素的个数,所以性能不好
@Test
public void test4() {
//不能保持原来的排序,会删除第一个出现的重复值
// Collections.frequency(Collection Object o):返回指定集合中指定对象出现的次数
List lists = Arrays.asList(“d”,“aa”,“a”,“AA”,“aa”,“bb”,“aa”,“cc”,“ss”,“ss”,“ss”);
lists=new ArrayList(lists);

for (int i = 0; i < lists.size(); i++) {
//如果一个元素出现2次以上,删除这个元素
if ( Collections.frequency(lists, lists.get(i))>1) {
lists.remove(i);
}
}
System.out.println(lists);
}

//Stream java8
@Test
public void test5() {
List lists = Arrays.asList(“d”,“aa”,“a”,“AA”,“aa”,“bb”,“aa”,“cc”,“ss”,“ss”,“ss”);
//distinct根据hashcode和equals来去重
lists = lists.stream().distinct().collect(Collectors.toList());
System.out.println(lists);
}

上一篇:c++ 静态成员和方法


下一篇:c#判断list链表是否有重复内容