由Set和List组合检验重复问题引发的思考以及验证

本文介绍如何使用Java集合框架中的Set和List来检查列表中的重复项,并提供了几种不同的实现方法,包括利用HashSet、StringBuilder和HashMap。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、如何利用set、list做检查重复的功能


代码展示

 public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("A");
        list.add("B");
        list.add("D");
        list.add("C");
        list.add("B");
        System.out.println("list  === > " + list);

        Set<String> set = new HashSet<String>();
        for(String s : list) {
            set.add(s);
        }
        System.out.println("set === >" + set);
        if(set.size() != list.size()) {
            System.out.println("有重复的元素存在");
        }

    }

上述代码的运行结果是:
list === > [A, B, D, C, B]
set === >[A, B, C, D]
有重复的元素存在

2、为什么会有上述效果呢?

ArrayList的add方法
ArrayList的add方法

/**
     * {@inheritDoc}
     * @throws IllegalArgumentException if this {@code AttributeList} is
     * <a href="#type-safe">type-safe</a> and {@code element} is not an
     * {@code Attribute}.
     */
    @Override
    public boolean add(Object element) {
        adding(element);
        return super.add(element);
    }

HashSet的add方法
HashSet的add方法

public boolean add(T o) {

            if (!o.getClass().isAssignableFrom(c)) {
                MessageFormat form = new MessageFormat(ResourcesMgr.getString
                        ("attempting.to.add.an.object.which.is.not.an.instance.of.class"));
                Object[] source = {c.toString()};
                throw new SecurityException(form.format(source));
            }

            return set.add(o);
        }

3、结论

List接口中的内容可以重复
Set接口不能加入重复元素,但是可以排序

4、其他实现检查List中存在重复的方法


代码展示1

利用StringBuilder

public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("A");
        list.add("B");
        list.add("D");
        list.add("C");
        list.add("B");
        list.add("C");
        System.out.println("list  === > " + list);
        StringBuilder builder = new StringBuilder();
        for (String str : list) {
            // 如果不存在返回 -1。
            if (builder.indexOf(str) > -1) {
                System.out.println("重复的有:" + str);
            } else {
                builder.append(str);
            }
        }
    }

上述代码的结果是:
list === > [A, B, D, C, B, C]
重复的有:B

>重复的有:C

代码展示2

利用Map

public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("A");
        list.add("B");
        list.add("D");
        list.add("C");
        list.add("B");
        list.add("B");
        list.add("C");
        System.out.println("list  === > " + list);
        HashMap<String,Integer> hashMap = new HashMap<String, Integer>();
        for(String string : list){
            if(hashMap.get(string) != null){  //hashMap包含遍历list中的当前元素
                Integer integer = hashMap.get(string);
                hashMap.put(string, integer+1);
                System.out.println("the element:"+string+" is repeat");
            }else{
                hashMap.put(string,1);
            }
        }

    }

上述代码的结果是:
list === > [A, B, D, C, B, B, C]
the element:B is repeat
the element:B is repeat
the element:C is repeat

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值