String类型的list怎么删除重复元素

这是我在面试的时候被面试官问到的问题。我当时说了用for循环和foreach循环,结果他叫我自己写代码验证一下。果不其然,我出现了很大的错误。特此记录一下。

1 用普通for循环删除重复元素

这里要注意一点是删除元素之后,list集合里的个数会变,所以要从高到低遍历,然后进行删除

//for (int i = list.size()-1; i >=0 ; i--) {
        //    if ("a".equals(list.get(i))){
        //        list.remove(list.get(i));
        //    }
        //}

后面我想起来了然后进行补充

2 用for循环删除

一开始我用代码测试的时候报了错

原因:foreach循环其实就是根据list对象创建一个Iterator迭代对象,用这个迭代对象来遍历list,相当于list对象中元素的遍历托管给了Iterator,你如果要对list进行增删操作,都必须经过Iterator,否则Iterator遍历时会乱,所以直接对list进行删除时,Iterator会抛出ConcurrentModificationException异常
可以在判断之后加个break结束循环,但是这样只能解决一个重复元素,要把所有的重复元素删除还要加一个循环。

for (int i = 0; i < list.size(); i++) {

            for (String str:list
            ) {
                if("a".equals(str)){
                    list.remove(str);
                    break;
                }
            }
        }

3 用iteator解决

这里如果用集合的remove方法也会报上面一样的错误,要用iteator自带的remove方法

 //Iterator<String> iterator = list.iterator();
        //while (iterator.hasNext()){
        //    String next = iterator.next();
        //    if(next.equals("a")){
        //        iterator.remove();
        //    }
        //}

4 完整代码

package com.qf.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author: 玉米
 * @description
 * @date: 2022/5/20 9:47
 */

public class Test5 {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("c");
        list.add("a");
        //1.用for循环删除a
        //for (int i = list.size()-1; i >=0 ; i--) {
        //    if ("a".equals(list.get(i))){
        //        list.remove(list.get(i));
        //    }
        //}
        //2 用foreach循环
        for (int i = 0; i < list.size(); i++) {

            for (String str:list
            ) {
                if("a".equals(str)){
                    list.remove(str);
                    break;
                }
            }
        }
        //3 用itator
        //Iterator<String> iterator = list.iterator();
        //while (iterator.hasNext()){
        //    String next = iterator.next();
        //    if(next.equals("a")){
        //        iterator.remove();
        //    }
        //}

        System.out.println(list);

    }
}

用这三种办法解决就可以删除a了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值