List去重的几种方法

 //HashSet是通过Hashcode和equals去重

//Treeset默认是通过自然排序接口去重

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

@Test
public void test1() {

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

}


  @Test
public void test2()  {
  //保留了原来的排序
  List<String> lists = Arrays.asList("aa","a","AA","aa","bb","cc","ss","ss","ss","aa","aa");
  //因为:Arrays.asList()返回一个受指定数组支持的固定大小的列表。所以不能做Add、Remove等操作。
  lists=new ArrayList<String>(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<String> lists = Arrays.asList("aa","a","AA","aa","bb","cc","ss","ss");

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

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

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

}


// 使用Collections.frequency ,看底层源码,他会统计每个元素的个数,所以性能不好
@Test
public void test4() {
//不能保持原来的排序,会删除第一个出现的重复值
// Collections.frequency(Collection Object o):返回指定集合中指定对象出现的次数
   List<String> lists = Arrays.asList("d","aa","a","AA","aa","bb","aa","cc","ss","ss","ss");
   lists=new ArrayList<String>(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<String> 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);
}
//目前就想到这些了,后面有再补充...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值