Java中List集合去除重复数据的五种方法

参考 Java中List集合去除重复数据的六种方法

  1. 循环list中的所有元素然后删除重复
  2. 通过 hashset 剔除重复元素
  3. 删除ArrayList中重复元素,保持顺序
  4. 把list里的对象遍历一遍,用list.contains(),如果不存在就放入到另外一个list集合中
  5. 用JDK1.8 Stream中对List进行去重:list.stream().distinct();
    demo: 新建 Test

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

/**
 *  list 集合去重
 *
 */
public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        List<String> lists = test.generateList();

//        test.removeDuplicate(lists);
//        test.quChong01(lists);
//        test.quChong02(lists);
//        test.quChong03(lists);
//        test.quChong04(lists);
        test.quChong05(lists);

        // 当 执行 quChong05()方法时, 出现不排序的原因是,quChong05()中 lists 更改了引用, 但 main 方法中 lists并没有更改引用
        test.listData(lists);  // 执行 quChong05(),如果再此处打印,程序不正常, 打印的是没有去重的集合

    }

    /**
     * 生成 lists 集合
     */
    public List<String> generateList(){
        List<String> lists = new ArrayList<String>();
        lists.add("hello");
        lists.add("world");
        lists.add("hello");
        lists.add("list");
        lists.add("hello");
        lists.add("hadoop");
        lists.add("java");
        lists.add("world");
        lists.add("list");
        lists.add("hadoop");
        return lists;
    }

    /**
     *  遍历数据
     * @param lists
     */
    public void listData(List<String> lists){
        lists.stream().forEach(item -> {
            System.out.println(item);
        });
    }


    /**
     *  循环list中的所有元素然后删除重复
     *  倒着删除时,
     *  1. 等删除可元素时, 该元素前的元素的索引是没有变化的
     *  2. 等 i = 0时,所有的元素都比较了,如果 i = 1, 索引为 0的元素,在上一次循环时已经比较了,因此无需再比较了
     * @param lists
     * @return
     */
    public void quChong01(List<String> lists){
        for(int i = 0; i < lists.size(); i++){
            for(int j = lists.size() - 1; j >= 0; j--){
                if(i != j){
                    if(lists.get(i).equals(lists.get(j))){
                        lists.remove(j);
//                        System.out.println(i + " " + j);
//                        System.out.println(lists.size());
//                        System.out.println(lists.toString());

                    }
                }
            }
        }
    }

    /**
     *  通过 hashset 剔除重复元素
     * @param lists
     */
    public void quChong02(List<String> lists){
        HashSet<String> set = new HashSet<>(lists);
        lists.clear();
        lists.addAll(set);
    }

    /**
     *  删除ArrayList中重复元素,保持顺序   
     * @param lists
     */
    public void quChong03(List<String> lists){
        HashSet<String> set = new HashSet<>();
        ArrayList<String> arrayList = new ArrayList<>();
        Iterator<String> iterator = lists.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            if(set.add(next)){ // 则证明 set 中 无此元素
                arrayList.add(next);
            }
        }
        lists.clear();
        lists.addAll(arrayList);
    }

    /**
     *  把list里的对象遍历一遍,用list.contains(),如果不存在就放入到另外一个list集合中
     * @param lists
     */
    public void quChong04(List<String> lists){
        ArrayList<String> arrayList = new ArrayList<>();
        for(String item: lists){
            if(!arrayList.contains(item)){  // 如果不包含此元素,则添加此元素
                arrayList.add(item);
            }
        }
        lists.clear();
        lists.addAll(arrayList);
    }


    /**
     * 用JDK1.8 Stream中对List进行去重:list.stream().distinct();
     * @param lists
     */
    public void quChong05(List<String> lists){
        List<String> collect = lists.stream().distinct().collect(Collectors.toList());

        // 当 执行 quChong05()方法时, 出现不排序的原因是,quChong05()中 lists 更改了引用, 但 main 方法中 lists并没有更改引用
        lists = collect;
//        listData(lists);  // 执行 quChong05(),如果再此处打印,程序正常
    }


    /**
     *  倒着删除时,
     *  1. 等删除可元素时, 该元素前的元素的索引是没有变化的
     *  2. 等 i = 0时,已经比较了,如果 i = 1, 索引为 0的元素,在上一次循环时已经比较了,因此无需再比较了
     * @param list
     * @return
     */
    public   static   List  removeDuplicate(List list)  {
        for  ( int  i  =   0 ; i  <  list.size()  -   1 ; i ++ )  {
            for  ( int  j  =  list.size()  -   1 ; j  >  i; j -- )  {
                if  (list.get(j).equals(list.get(i)))  {
                    list.remove(j);
                }
            }
        }
        return list;
    }


}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值