删除集合中一个指定的元素& remove元素失败

Java基础——删除集合中一个指定的元素

        List<String> lst =new ArrayList<String>();
        lst.add("b");
        lst.add("b");
        lst.add("a");
        lst.add("c");
错误的操作1
        for(int i=0;i<lst.size();i++)
        {
            if("b".equals(lst.get(i)))
            {
                lst.remove(i);
            }
        }
        System.out.println(lst);
        // 结果是 [b, a, c]
错误的操作2
        for(Integer i=0;i<lst.size();i++)
        {
            if("b".equals(lst.get(i)))
            {

                lst.remove(i);
                
            }
        }
         System.out.println(lst);
         // [b, b, a, c]

错误的操作1是由于没有注意删除时后面元素往前移,for的指针往后移问题。

正确的操作:
  • 1.使用for删除一个元素时进行回调,ArrayList的底层结构是数组类型,数组这种数据结构的特点是删除其中某个元素时,后面的所有元素索引都会前移,此时for循环的指针却会下移,因此会略过下一个元素,解决方案是删除时将指针回调一次。
        for(int i=0;i<lst.size();i++)
        {
            if("b".equals(lst.get(i)))
            {
                lst.remove(i);
                i--;
            }
        }
  • 2 . 使用迭代器来操作
  Iterator it=lst.iterator();
        while(it.hasNext())
        {
            if(it.next().equals("b"))
            {
                it.remove();
            }
        }

问题2中的探索

问题2的原因是定义循环的索引为Integer类型,关于remove我们可以看源码,ArrayList.java中有两个remove函数。

   // 索引是int类型
    public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }
// 索引是Object类型
    public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }
//fastremove
    private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
    }

也就是说,如果是对象类型,那么就去查找elementData中的值与这个对象类型值是equals的元素,并且fastremove。如果我们传入Integer类型的 0或者1,我们插入的元素并没有这个,所以就不会删除“b”了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用RedisTemplate的opsForList()方法获取List类型的操作对象,然后使用remove()方法根据索引删除指定元素,示例代码如下: redisTemplate.opsForList().remove("listKey", 1, "elementValue"); 其,"listKey"是要操作的List集合的键名,1表示删除一个匹配的元素,"elementValue"是要删除元素的值。 ### 回答2: 在使用RedisTemplate删除List集合指定元素时,可以通过以下步骤实现: 1. 首先,需要获取RedisTemplate实例,并设置好对应的序列化方式。可以使用以下代码获取: ```java RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.afterPropertiesSet(); ``` 这里使用了Jackson2JsonRedisSerializer作为默认的序列化方式,可以根据实际情况选择合适的序列化方式。 2. 接下来,需要使用RedisTemplate的`boundListOps(key)`方法获取操作指定键值的列表对象。其,key为存储该List的键值。 ```java BoundListOperations<String, Object> boundListOps = redisTemplate.boundListOps("list_key"); ``` 3. 然后,可以使用RedisTemplate的`remove(key, count, value)`方法从List集合删除指定元素。其,count参数为删除的数量,可以是负数,表示从尾部开始删除;value参数为要删除元素。 ```java boundListOps.remove("list_key", 1, "要删除元素"); ``` 这里的count参数为1,表示删除指定元素的第一个匹配项,若存在多个相同的元素,可以根据实际情况进行调整。 综上所述,使用RedisTemplate可以根据指定索引删除List集合的某一个元素。 ### 回答3: 使用RedisTemplate删除list集合的某个元素,可以使用内置的remove方法来实现。具体步骤如下: 1. 首先,通过RedisTemplate的opsForList方法获取到指定list集合的操作对象。 ```java ListOperations<String, String> listOps = redisTemplate.opsForList(); ``` 2. 接下来,使用listOps的remove方法来删除指定元素。该方法接受三个参数:集合的key、要删除元素、以及要删除的数量。 ```java Long removedCount = listOps.remove("listKey", "要删除元素", 1); ``` 上述示例,我们传入了集合的key为"listKey",要删除元素为"要删除元素",数量为1。如果该元素存在且删除成功,则返回删除的数量。如果该元素不存在,则返回0。 3. 最后,我们可以根据返回的删除数量来确定删除是否成功。 ```java if (removedCount > 0) { System.out.println("成功删除了" + removedCount + "个元素"); } else { System.out.println("该元素不存在,删除失败"); } ``` 以上就是使用RedisTemplate根据指定索引删除list集合某个元素的步骤。需要注意的是,Redis的List数据结构是有序的,可以通过索引访问和操作,但是删除操作需要通过先查询元素值,再删除的方式实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值