`
yznxing
  • 浏览: 370085 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于list的一个小知识

    博客分类:
  • java
 
阅读更多

最近咋使用  list.remove   方法的时候出了点问题。。。
贴出来,记录下。

public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<Integer> list = new ArrayList();// =null error
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        list.add(8);
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) > 4)
                list.remove(i);
        }
        

        System.out.println(Arrays.toString(list.toArray()));

}

假定我们的代码如上。就是想把list里面大于4的值都remove掉,然后得到的list。
可是这个程序在运行后,会按照预期的值,打印出来的结果都是小于4的吗???

打印结果为:[1, 2, 3, 4, 6, 8]

答案是否定。主要是使用 i 下标在 list 内索引时,由于使用了remove会导致list内部的数组总值也就是length
变小,从而导致使用i在数组内索引时会导致空过一个元素。


解决办法有两个:
第一个将i从list.size()-1 开始索引,从后向前遍历就不会出问题的。
还有就是使用 迭代 Iterator 。

Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            if (it.next() > 4) {
                it.remove();
            }
        }

这个可以主要是ArrayList内部的iterator返回的Iterator对象的remove方法在remove过之后会将当前索引值 减一。

相关内部实现为:

public void remove() {
        if (lastRet == -1)
        throw new IllegalStateException();
            checkForComodification();

        try {
        AbstractList.this.remove(lastRet);
        if (lastRet < cursor)
            cursor--;
        lastRet = -1;
        expectedModCount = modCount;
        } catch(IndexOutOfBoundsException e) {
        throw new ConcurrentModificationException();
        }
    }

从而可以成功的达到我们的目的。

 

 

1
2
分享到:
评论

相关推荐

    两个list比较 取不同的对象

    本文将详细探讨如何通过一个示例代码来理解如何比较两个`List`并提取出不同的对象。 #### 核心知识点解析 1. **列表(List)的基础操作**: - `List`是一种常用的数据结构,在Java中,`List`接口是`Collection`框架...

    List转换为List

    4. **将Map添加到新的List中**:每当创建完一个Map后,将其添加到一个新的List集合中。 5. **返回新的List**:最终返回包含Map对象的List集合。 #### 示例代码: 假设有一个AnnouncementBean类,包含属性:actid...

    C#List集合分组winform把List分组

    下面是一个简单的例子,展示了如何使用Linq对一个包含自定义对象的List进行分组: ```csharp public class Person { public string Name { get; set; } public int Age { get; set; } } List&lt;Person&gt; people = ...

    java的list取之方法

    在Java中,`List`接口是`Collection`框架的一个重要组成部分,它继承自`Collection`接口。`List`是一种有序集合,允许包含重复元素。`List`的主要特点是可以通过索引访问元素,同时也支持插入、删除等操作。 ### ...

    关于LIstCtrl的一些总结

    `ListCtrl`是Windows编程中的一个重要组件,它提供了一种灵活的方式来展示一系列项,并且能够以不同的视图模式显示这些项,比如列表视图(List)、详细视图(Detail)、图标视图(Icons)、小图标视图(Small Icons)等。...

    webservice获取List案例

    6. **文件08_01_webservice**:这个名字可能表示这是一个关于第八章第一节的WebService示例。这个文件可能是一个包含源代码、配置文件和其他相关资源的项目文件夹。要学习这个案例,你需要解压文件并查看其中的代码...

    java合并LIST

    2. 使用addAll()方法合并LIST:addAll()方法是Java中的一个集合操作方法,用于将一个集合中的所有元素添加到另一个集合中。 3. 避免LIST中的元素重复:在合并LIST时,需要考虑到LIST中的元素可能存在重复的情况,...

    java获取list中两元素时间差

    SimpleDateFormat 是 Java 中的一个类,用于格式化日期和时间。 小结 本例中,我们学习了如何在 Java 中获取 List 中两元素时间差。我们使用了 ArrayList 来存储时间字段,并使用 SimpleDateFormat 来格式化时间...

    浅谈List.h,list.h函数解析

    List.h头文件中定义了一个链表结构体struct list_head,包含两个指针next和prev,分别指向链表中的下一个节点和前一个节点。链表的初始化可以通过宏LIST_HEAD_INIT(name)和LIST_HEAD(name)来实现,效果都是将链表的...

    List转换成String数组

    本文将详细介绍如何将一个`List&lt;String&gt;`类型的集合转换为`String[]`数组,并通过不同的方法来实现这一过程。这不仅有助于提高代码的可读性和效率,还能帮助开发者更好地理解和运用Java集合框架。 #### 一、背景...

    list转换成string数组

    `List`接口的一个具体实现是`ArrayList`。 - **String**:`String`类代表字符序列,是不可变的对象。`String`对象一旦创建后,其内容就不能改变。 - **数组(Array)**:数组是一种基本的数据结构,用于存储固定大小的...

    关于checkboxlist的绑定和遍历checkboxlist

    在.NET框架中,CheckBoxList控件是经常用于网页设计中的一种多选列表控件,它允许用户通过勾选复选框来选择一个或多个选项。本文将深入探讨关于CheckBoxList的绑定和遍历的实现方法及其相关知识点。 一、CheckBox...

    把excel导入List中行也为list

    在Java编程中,将Excel数据导入到一个List中,其中每一行数据表示为一个List,是一种常见的数据处理需求。这种操作对于数据分析、数据存储或数据传输等场景非常实用。下面我们将详细讨论如何实现这个功能,以及涉及...

    使用图片美化List列表

    总结来说,这个“使用图片美化List列表”的项目是关于在MFC应用中提升CListCtrl控件视觉效果的一种实践,它涉及到资源管理、图像列表的使用、列表项的插入和事件处理等多个知识点。通过学习和实践,开发者可以提升...

    Python列表list操作相关知识小结

    `del list[m]`删除指定索引的元素,`remove()`删除指定值的第一个出现,`pop()`默认移除并返回最后一个元素,`pop(m)`移除并返回指定索引的元素,`clear()`则清空所有元素: ```python li = [1, 2, 3, 4] li.remove...

    blocklist_BlockList_zip_源码

    标签“BlockList zip”巩固了我们的理解,这是一个关于BlockList的压缩文件,可能包含配置文件、规则列表或者相关的实现代码。 在压缩包内的文件“blocklist.xml”,我们可以推测这是BlockList的核心数据文件,存储...

    c#多个结构类型相同的list 组合

    首先,`List&lt;T&gt;.AddRange()` 方法是C#中用于向现有列表添加另一个列表的所有元素的便捷方法。它接受一个类型的`IEnumerable&lt;T&gt;`作为参数,这意味着你可以传递任何可枚举的对象,只要它的元素类型与列表本身的元素...

    mfc的listctrl

    以上就是关于MFC ListCtrl的自绘、项的高度和颜色设置,以及如何添加编辑功能的一些基础知识。实际应用中,可能还需要结合其他MFC特性,如虚拟模式(Virtual Mode)来提高性能,或者使用LVCFMT_BITMAP_ON_RIGHT等...

    java list和xml互转例子

    List是Java集合框架的一部分,它是一个有序的集合,可以存储多个元素,且允许有重复元素。XML(Extensible Markup Language)则是一种标记语言,用于存储和传输数据,特别适合于结构化数据的表示。 1. **Java List...

    遍历CheckBoxList,获得选中项的值动态绑定CheckBoxList代码

    **CheckBoxList** 是ASP.NET Web Forms中一个非常有用的控件,它允许用户选择一个或多个选项。CheckBoxList 控件在页面上呈现为一系列复选框,每个复选框代表一个选项。它非常适合用于用户需要进行多选的情况,比如...

Global site tag (gtag.js) - Google Analytics