精华内容
下载资源
问答
  • 修改集合中的元素
    千次阅读
    2021-02-28 15:24:19

    publicclassCollectionTest{privatevoidtestCol(){Listcol=newArrayList();col.add(1);col.add(3);col.add(3);col.add(2);Iteratorit=col.iterator();while(it.hasNext()){inta=(Inte...

    public class CollectionTest {

    private void testCol(){

    List col=new ArrayList();

    col.add(1);

    col.add(3);

    col.add(3);

    col.add(2);

    Iterator it= col.iterator();

    while(it.hasNext()){

    int a =(Integer)it.next();

    System.out.println("a=="+a);

    }

    Object objs[] = col.toArray();

    col.clear();

    for(int i=0;i

    if(objs[i].equals(3)){

    objs[i] = 4;

    }

    col.add(objs[i]);

    }

    it= col.iterator();

    while(it.hasNext()){

    int a =(Integer)it.next();

    System.out.println("4a=="+a);

    }

    }

    输出后显示a==1

    a==3

    a==3

    a==2

    4a==1

    4a==4

    4a==4

    4a==2

    但是我只想要a的第二项的3修改成4,第三项还是3,结果到4a的输出后全部的3都变成4了

    有什么好办法吗?、

    展开

    更多相关内容
  • 在java如果我们需要遍历集合并删除其中的某些元素时,例如对于List来说,我们有三种办法。1. 普通的for循环遍历并删除public void forRemove(Listlist, T obj){for(int i = 0;i < list.size(); i++){if (obj ==...

    在java中如果我们需要遍历集合并删除其中的某些元素时,例如对于List来说,我们有三种办法。

    1. 普通的for循环遍历并删除

    public void forRemove(Listlist, T obj){

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

    if (obj == list.get(i))

    {

    list.remove(obj);

    }

    }

    }

    main中调用

    Listlist = new ArrayList<>();

    list.add("1");

    list.add("2");

    list.add("2");

    list.add("3");

    re.forRemove(list,"2");

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

    程序输出[1,2,3]

    这是因为,删除时改变了list的长度。删除第一个2后,长度变为了3,这时list.get(2)为3,不再是2了,不能删除第2个2

    2. forEach循环删除

    public void forEachRemove(Listlist, T obj){

    for(T item : list){

    if (item.equals(obj)) {

    list.remove(obj);

    }

    }

    }

    main方法中:

    Listlist = new ArrayList<>();

    list.add("1");

    list.add("2");

    list.add("2");

    list.add("3");

    //re.forRemove(list,"2");

    re.forEachRemove(list,"2");

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

    程序输出:

    e2f3df29a3750fa73d77570147117d02.png

    从运行结果看到程序抛ConcurrentModificationException。

    JDK的API中对该异常描述道:

    public class ConcurrentModificationException extends RuntimeException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

    例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。

    注意,此异常不会始终指出对象已经由不同 线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。

    注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败操作会尽最大努力抛出 ConcurrentModificationException。因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法,正确做法是:ConcurrentModificationException 应该仅用于检测 bug。

    Java中的For each实际上使用的是iterator进行处理的。而iterator是不允许集合在iterator使用期间删除的。所以导致了iterator抛出了ConcurrentModificationException 。

    3. Iterator 迭代器删除(推荐)

    public void iteratorRemove(Listlist, T obj){

    Iteratorit = list.iterator();

    while(it.hasNext()){

    T item = it.next();

    if (item.equals(obj))

    {

    it.remove();//remove the current item

    }

    }

    }

    Listlist = new ArrayList<>();

    list.add("1");

    list.add("2");

    list.add("2");

    list.add("3");

    //re.forRemove(list,"2");

    //re.forEachRemove(list,"2");

    re.iteratorRemove(list,"2");

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

    程序输出:

    18fb994bc911fd793a69a589b57b9d2e.png

    可以看到这才是真正的删除了我们想删除的元素。但是需要注意以下两点

    对Iterator的remove()方法调用必须在Iterator的next()方法之后。

    调用next()方法后只能执行一次remove()方法

    综上,对于集合的删除操作,特别是List,需要使用迭代器来操作。

    补充知识:java中的Collection集合的存入与删除

    在java的集合中存储的都是引用类型元素,而且集合只保存每个元素对象的引用,而并非将元素对象本身存入集合。

    Collection集合中的remove方法,对于重复元素而言只删除一个

    在遍历集合时,若想删除集合里面的元素,只能通过迭代器的删除方法去删除,不能使用集合本身的方法。(这也是为什么在增强for循环中不能使用集合的方法删除元素的原因,因为增强for循环是编译器认可而并不是虚拟机认可。编译器最终会把新循环改编为迭代器循环)

    以上这篇java 如何实现正确的删除集合中的元素就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • Java集合――遍历集合元素修改

    千次阅读 2021-03-13 08:42:30
    Java集合――遍历集合元素并修改摘要:本文主要总结了遍历集合的方式,以及在遍历时修改集合要注意的问题。遍历Collection对List和Set的遍历,有四种方式,下面以List为例进行说明。普通for循环代码如下:1 for (int...

    Java集合――遍历集合元素并修改

    摘要:本文主要总结了遍历集合的方式,以及在遍历时修改集合要注意的问题。

    遍历Collection

    对List和Set的遍历,有四种方式,下面以List为例进行说明。

    普通for循环

    代码如下:

    1 for (int i = 0; i < list.size(); i++) { 2 System.out.println(i); 3 }

    如果要在普通for循环里对集合元素进行删除操作,可能会出现问题:

    1 public static void main(String[] args) { 2 List list = new ArrayList(); 3 list.add(1); 4 list.add(2); 5 list.add(2); 6 list.add(4); 7 list.add(5); 8 for (int i = 0; i < list.size(); i++) { 9 if (list.get(i) == 2) { 10 list.remove(i); 11 } 12 } 13 System.out.println(list); 14 }

    运行结果如下:

    1 [1, 2, 4, 5]

    结果说明:

    集合中有两个值为2的元素,但是在代码执行之后,值为2的元素并没有完全移除。

    i = 1i = 1

    i = 2

    i--

    增强for循环

    代码如下:

    1 for (Integer i : list) { 2 System.out.println(i); 3 }

    如果想在增强for循环里删除或者添加集合元素,那么一定会报异常:

    1 public static void main(String[] args) { 2 List list = new ArrayList(); 3 list.add(1); 4 list.add(2); 5 list.add(2); 6 list.add(4); 7 list.add(5); 8 for (Integer i : list) { 9 if (i == 2) { 10 list.remove(i); 11 } 12 } 13 System.out.println(list); 14 }

    运行结果如下:

    1 java.util.ConcurrentModificationException

    结果说明:

    因为增强for循环(foreach循环)本质上是隐式的iterator,由于在删除和添加的时候会导致modCount发生变化,但是没有重新设置expectedModCount,当你使用list.remove()后遍历执行iterator.next()时,方法检验modCount的值和的expectedModCount值,如果不相等,就会报ConcurrentModificationException。

    使用迭代器iterator

    代码如下:

    1 while (iterator.hasNext()) { 2 Integer i = (Integer) iterator.next(); 3 System.out.println(i); 4 }

    如果在迭代的循化里使用list方法的add()方法和remove()方法,同样会报错:

    1 public static void main(String[] args) { 2 List list = new ArrayList(); 3 list.add(1); 4 list.add(2); 5 list.add(2); 6 list.add(4); 7 list.add(5); 8 Iterator iterator = list.iterator(); 9 while (iterator.hasNext()) { 10 Integer i = (Integer) iterator.next(); 11 if (i == 2) { 12 list.add(6); 13 } 14 } 15 }

    运行结果如下:

    1 java.util.ConcurrentModificationException

    如果在迭代器的循环里使用迭代器的remove()方法,则不会报错,迭代器没有提供添加的方法:

    1 public static void main(String[] args) { 2 List list = new ArrayList(); 3 list.add(1); 4 list.add(2); 5 list.add(2); 6 list.add(4); 7 list.add(5); 8 Iterator iterator = list.iterator(); 9 while (iterator.hasNext()) { 10 Integer i = (Integer) iterator.next(); 11 if (i == 2) { 12 iterator.remove(); 13 } 14 } 15 System.out.println(list); 16 }

    运行结果如下:

    1 [1, 4, 5]

    结果说明:

    迭代器的remove()方法同时维护了modCount和expectedModCount,所以使用remove()方法可以达到预期的效果。

    展开全文
  • 集合遍历时,修改元素

    千次阅读 2021-03-13 08:41:43
    import java.util.ArrayList;import java.util.Iterator;import java.util.List;.../**** @author Ginfer* @virsion* HP* collection* HP* 当迭代器在遍历元素的时候,集合时不能修改元素的,会报ConcurrentModific...

    import java.util.ArrayList;

    import java.util.Iterator;

    import java.util.List;

    import java.util.ListIterator;

    /**

    *

    * @author Ginfer

    * @virsion

    * HP

    * collection

    * HP

    * 当迭代器在遍历元素的时候,集合时不能修改元素的,会报ConcurrentModificationException(并发修改异常)

    * 迭代器依赖于集合存在,在判断成功后,集合中添加元素是,迭代器不知道,所以会报错

    * 这个错叫并发修改异常,如何解决呢?

    * 1.迭代器迭代元素,迭代器修改元素

    * 但是Iterator没有添加功能

    * 2.集合遍历元素,集合修改元素

    *

    *

    */

    public class Demo3 {

    public static void main(String[] args) {

    List list=new ArrayList();

    list.add("asd");

    list.add("asdf");

    list.add("asdfg");

    /*Iterator it=list.iterator();

    while(it.hasNext()){

    String s=(String) it.next();

    if("asd".equals(s)){

    list.add("nihao");

    }

    }*/

    //方法1.迭代器迭代元素,迭代器修改元素,元素在查找的元素后面添加

    ListIterator lit=list.listIterator();

    while(lit.hasNext()){

    String s=(String)lit.next();

    if("asd".equals(s)){

    lit.add("zxc");

    }

    }

    System.out.println("list:"+list);

    //方法2.集合遍历元素,集合修改元素,元素在集合的最后添加

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

    if("asd".equals(list.get(i))){

    list.add("bnm");

    }

    }

    System.out.println("list:"+list);

    }

    }

    展开全文
  • 最初开始看并不对劲,因为我记得不能直接修改集合中元素。于是便进行了测试。 果然报错了,那么为什嚒最初的那个代码可以运行成功呢? 我把泛型进行了修改,再次进行测试: 可以看到完全没问题,结果也成功的...
  • Java集合中元素删除

    千次阅读 2022-04-23 19:37:01
    在Java删除集合中元素时,需要特别注意,一方面是因为,Java是并发编程语言,如果存在并发操作,则会出现逻辑异常;另一方面,在List删除元素,如果操作不当,则会抛出异常。
  • var list2 = list.Select(x => { x.Info = x.Info.Trim(new char[] { ':', ':' }); return x; }).ToList(); 注意有{}: x => { x.Info = x.Info.Trim(new char[] { ':', ':' }); return x;...
  • JAVA stream流对集合进行替换修改

    千次阅读 2022-06-06 17:33:40
    java 对list进行替换和修改
  • 集合中元素_Python Set集合

    千次阅读 2021-03-06 22:33:24
    Set集合阅读本文需要3分钟2019.09.05集合(set)是一个无序不重复元素的序列。基本功能是进行成员关系测试和删除重复元素。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { }...
  • forEach语句能否修改集合元素的值?

    千次阅读 2019-11-08 14:48:33
    forEach语句可以修改集合/数组元素为对象的值,但不可以修改数组元素为变量的值。 forEach语句不能在集合/数组添加或删除对象。 二. 问题复现 1. 数组元素为变量 结论:当数组元素为变量时,forEach循...
  • 我们之前所学的集合可以往其中增加删除元素,使用上比较灵活,但我们也有一些时候需要固定集合元素,不让集合出现变动,增加数据的稳定性,这时候就需要python的frozenset不可变集合。那么如果我们试着去改变...
  • Java集合——遍历集合元素修改

    千次阅读 2019-03-14 11:05:00
    Java集合——遍历集合元素并修改 摘要:本文主要总结了遍历集合的方式,以及在遍历时修改集合要注意的问题。 遍历Collection 对List和Set的遍历,有四种方式,下面以ArrayList为例进行说明。 1)普通for循环 ...
  • java8修改list集合元素的属性

    万次阅读 2019-12-11 10:17:13
    java8修改list集合元素的属性,超简单 解决方法: question.getRowOptions()是List集合,现在遍历修改元素的setOptId值 question.getRowOptions().forEach(http://www.yayihouse.com/yayishuwu/chapter/2325); ...
  • Java删除List集合中元素的方法

    千次阅读 2021-11-12 16:05:11
    } 这样做会抛出异常,因为不允许在元素被使用的时候同时被修改。 正确方法 执行remove后break跳出循环,则不会抛出异常,但这样只能删除一个元素 for (Integer i : list) { list.remove(i); break; } 输出结果 2、...
  • Java删除集合中的指定元素

    千次阅读 2022-04-14 19:42:05
    当我们从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题。 哪些遍历存在问题? a.迭代器遍历集合且直接用集合删除元素的时候可能出现。 b.增强for循环遍历集合且直接用集合删除元素的时候可能出现...
  • (1)向集合中添加元素,如果集合中已存在元素则不添加(2)从集合中移除元素,移除之前需要先判断集合中元素是否存在(3)重载+运算符,用以实现集合的求并集运算(4)重载*运算符,用以实现集合的求交集运算1....
  • pythonlist列表修改元素

    千次阅读 2022-04-29 22:16:24
    python提供了两种修改列表(list)元素的方法,你可以修改单个元素,也可以每次修改多个元素 修改单个元素 修改单个元素直接对元素赋值即可 示例: list = ["python",1,2,"java",78,9,80,90,2,34,2] print...
  • 每次增加或删除一个元素的时候,modCount都会加一,而expectedModCount用于记录在集合遍历之前的modCount,检查这两者是否相等就是为了检查集合在迭代遍历的过程有没有被修改,如果被修改了,就会在运行时抛出...
  • import java.util.ArrayList;import java.util.List;...public class TextDemo1 { public static void main(String[] args) { //创建集合对象 List list = new ArrayList(); //添加元素 list...
  • 我们往往会遇到要批量修改集合中元素的值,最笨的办法就是foreach循环,但本文介绍几种优雅的方法。 首先,我们准备好元素类和初始集合: 下面就是几种方法,目前并没有对性能做进一步的测试,有兴趣的童鞋...
  • 利用集合A元素(我是为了取属性值),生成一个新的集合B,两个集合元素类型可以不一样。 org.springframework.data.domain.Page: Page<T> targetPage = sourcePage.map(variable -> { //生成新类型...
  • 设想你有一个简单的需求:在一个ArrayList的某个位置插入一个新的元素,于是你写下了如下代码 ArrayList<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list....
  • 我在项目需要修改mongoDB的一条记录的子集属性,如下: { "_id" : ObjectId("5c875d13bfb42a9cb35b8c73"), "Product_Id" : "121-00738", "ProductGroups" : [ { "Product_Id" : "121-00738", ...
  • C++ 请问一下怎么通过迭代器对list里面的数据进行修改 急!!!
  • java list删除或修改其中的元素

    千次阅读 2022-05-06 15:22:13
    删除list的某些元素 // 写法一: import java.util.*; import java.util.stream.Collectors; public class HelloWorld { public static void main(String []args) { List<String> str = new ArrayList();...
  • 一、list集合循环删除元素 1.通过普通的for删除删除符合条件的多个元素 for(int i=0;ilist.size();i++){ if(list.get(i).equals("del")) list.remove(i); } 上面这种方式会抛出java.lang....
  • 列表可以作为集合元素

    千次阅读 2021-01-29 12:17:21
    【判断题】列表可以作为集合元素。 (2.0分)【判断题】函数必须包含return语句。 (3.5分)【单选题】以下哪条语句定义了一个Python字典( ) (3.0分)【判断题】函数是代码复用的一种方式。 (3.5分)【单选题】x = ...
  • Java中集合foreach删除元素问题

    千次阅读 2020-11-15 10:43:52
    } } 首先先了解一下其中属性的含义 modCount— 在父类AbstractList初始化为0,表示集合修改次数的期望值 cursor --迭代器的游标,元素的索引值,初始值为0 lastRet --返回最后一个元素的索引值、如果没有找到则...
  • 采用增强for循环与iterator修改集合或者数组的内容

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 491,963
精华内容 196,785
关键字:

修改集合中的元素