黑马程序员技术交流社区

标题: 将List集合中的部分元素替换成指定元素的问题!! [打印本页]

作者: 刘俊佳    时间: 2012-7-26 19:28
标题: 将List集合中的部分元素替换成指定元素的问题!!
本帖最后由 刘俊佳 于 2012-7-28 10:43 编辑

这是代码:

package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsDemo2 {
        public static void main(String[] args)
        {
                fillDemo();
        }

        public static void fillDemo() {
                List<String> list = new ArrayList<String>();

                list.add("abcd");
                list.add("aaa");
                list.add("zz");
                list.add("kkkkk");

                sop(list);
                Collections.fill(list, "pp");
                sop(list);
        }

        public static void sop(Object obj) {
                System.out.println(obj);
        }
}
这里的这个fill方法可以将List集合中的所有元素替换成指定元素,如果我想把List集合中的部分元素替换成指定元素该怎么做呢?
作者: 王渠    时间: 2012-7-26 19:36
首先如果你确定你要移除什么元素的话,你可以再定义一个ArratList 对象,把要移除的元素存入对象,两个ArrayList对象求差集嘛
作者: 刘同超    时间: 2012-7-26 19:46
  1.         public static void fillDemo() {
  2.                 List<String> list = new ArrayList<String>();

  3.                 list.add("abcd");
  4.                 list.add("aaa");
  5.                 list.add("zz");
  6.                 list.add("kkkkk");

  7.                 sop(list);
  8.                 list.set(0, "a");  // set啊。指定下表索引,进行替换。
  9.                 sop(list);
  10.         }

  11.         public static void sop(Object obj) {
  12.                 System.out.println(obj);
  13.         }
复制代码
已加注释,另外。
      void add(int index, Object element) :添加对象element到位置index上
      boolean addAll(int index, Collection collection) :在index位置后添加容器collection中所有的元素
      Object get(int index) :取出下标为index的位置的元素
      int indexOf(Object element) :查找对象element 在List中第一次出现的位置
      int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置
      Object remove(int index) :删除index位置上的元素
      Object set(int index, Object element) :将index位置上的对象替换为element并返回老的元素。
作者: 余清兰    时间: 2012-7-26 20:09
你可以用List类里的特有的迭代器方法listIterator();在迭代的过程中进行判断要修改的元素,用set进行重新设置
代码如下:
  1. import java.util.*;
  2. class CollectionsDemo2 {
  3.         public static void main(String[] args)
  4.         {
  5.                 fillDemo();
  6.         }

  7.         public static void fillDemo() {
  8.                 List<String> list = new ArrayList<String>();

  9.                 list.add("abcd");
  10.                 list.add("aaa");
  11.                 list.add("zz");
  12.                 list.add("kkkkk");

  13.                 sop("原集合"+list);
  14.                                 ListIterator<String> li = list.listIterator();
  15.                                 while(li.hasNext())
  16.                                 {
  17.                                         Object obj = li.next();
  18.                                         if(obj.equals("aaa"))
  19.                                                 li.set("java");
  20.                                        
  21.                                        
  22.                                 }
  23.                            sop("新集合"+list);
  24.         }

  25.         public static void sop(Object obj) {
  26.                 System.out.println(obj);
  27.         }
复制代码

作者: 刘俊佳    时间: 2012-7-27 18:25
刘同超 发表于 2012-7-26 19:46
已加注释,另外。
      void add(int index, Object element) :添加对象element到位置index上
      bool ...

我的意思不是这样,我是说怎样把集合里面,如的部分元素替换成指定的元素,如把集合里面的abcd和aaa都替换成pp,而其他元素不变。
作者: 刘俊佳    时间: 2012-7-27 18:34
余清兰 发表于 2012-7-26 20:09
你可以用List类里的特有的迭代器方法listIterator();在迭代的过程中进行判断要修改的元素,用set进行重新设 ...

那替换部分呢?比如把abcd和aaa替换成pp,其他元素不变
作者: 刘同超    时间: 2012-7-27 19:43
  1.             List<String> list = new ArrayList<String>();

  2.             list.add("abcd");
  3.             list.add("aaa");
  4.             list.add("zz");
  5.             list.add("kkkkk");

  6.             sop(list);
  7.             
  8.             for (int i = 0; i < list.size(); i++) {
  9.                    
  10.                     String str=list.get(i);  // 获取当前索引内list的值
  11.                    
  12.                     // 判断是否是指定数据。
  13.                     if(str.equals("abcd"))
  14.                     {
  15.                             // 替换数据
  16.                             list.set(i, "a");
  17.                     }
  18.                    
  19.                     // 判断是否是指定数据。
  20.                     if(str.equals("aaa"))
  21.                     {
  22.                             // 替换数据
  23.                             list.set(i, "a");
  24.                     }
  25.                    
  26.                         }
  27.             sop(list);
  28.     }
  29.        

  30.     public static void sop(Object obj) {
  31.             System.out.println(obj);
  32.     }
复制代码
不知道这个是不是你想要的?
作者: 吴立杰    时间: 2012-7-27 21:57
这个简单啦,你可以把你不想删的那部分放到一个新的Arraylist集合中,然后把再把旧集合中的所有元素替换为指定元素,最后遍历或迭代用新集合中的元素替换旧集合中的元素。哦了。
作者: 刘俊佳    时间: 2012-7-28 10:42
吴立杰 发表于 2012-7-27 21:57
这个简单啦,你可以把你不想删的那部分放到一个新的Arraylist集合中,然后把再把旧集合中的所有元素替换为 ...

额   看来我思想还不够缜密,哦了,谢谢了
作者: 杨胜男    时间: 2014-6-12 20:00
王渠 发表于 2012-7-26 19:36
首先如果你确定你要移除什么元素的话,你可以再定义一个ArratList 对象,把要移除的元素存入对象,两个Arra ...

不错                 
作者: shiyan    时间: 2014-10-22 15:34
可以用List中的set方法

java.png (86.31 KB, 下载次数: 441)

java.png

作者: 芭芭拉2    时间: 2015-1-5 09:55
shiyan 发表于 2014-10-22 15:34
可以用List中的set方法

想法不谋而合。。。
作者: 芭芭拉2    时间: 2015-1-5 09:58
shiyan 发表于 2014-10-22 15:34
可以用List中的set方法

想法不谋而合。。。
作者: 谢永烽    时间: 2015-3-31 14:55
学习了·················
作者: cp0717    时间: 2016-4-25 20:41
思路如下:将list切分成3个subList,分别从(0,start)(start,end)(end,list.size())开始,将第二个list用fill方法填充,然后进行拼接
public static void fill(List<String> list,int start,int end,String obj)
        {
                List<String> l1 = list.subList(0,start);
                List<String> l2 = list.subList(start,end);
                List<String> l3 = list.subList(end,list.size());
                l1.addAll(l3);
                Collections.fill(l2,obj);
                l1.addAll(l2);
                System.out.println(l1);

        }
作者: cp0717    时间: 2016-4-25 20:44
cp0717 发表于 2016-4-25 20:41
思路如下:将list切分成3个subList,分别从(0,start)(start,end)(end,list.size())开始,将第二个list用fill ...

拼接过程中有问题,应该是并发修改的问题。暂时还没想到解决方式。求大神告知
        Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231)
        at java.util.ArrayList$SubList.size(ArrayList.java:1040)
        at java.util.Collections.fill(Collections.java:522)
        at FillDemo.fill(FillDemo.java:23)
        at FillDemo.main(FillDemo.java:15)
作者: cp0717    时间: 2016-4-25 22:15
芭芭拉2 发表于 2015-1-5 09:58
想法不谋而合。。。

好像可以用这种方式。
打印结果如下:
[aaa, aab, abc, baa, bba, bca, azz]
[hhh, hhh, hhh]
[aaa, aab, hhh, hhh, hhh, bca, azz]
  1. import java.util.*;
  2. class FillDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 List<String> list = new ArrayList<String>();
  7.                 list.add("aaa");
  8.                 list.add("aab");
  9.                 list.add("abc");
  10.                 list.add("baa");
  11.                 list.add("bba");
  12.                 list.add("bca");
  13.                 list.add("azz");
  14.                 System.out.println(list);
  15.                 fill(list,2,5,"hhh");
  16.         }
  17.         public static void fill(List<String> list,int start,int end,String str)
  18.         {
  19.                 List<String> l2 = list.subList(start,end);                       
  20.                 Collections.fill(l2,str);               
  21.                 System.out.println(l2);
  22.                 System.out.println(list);

  23.         }
  24. }
复制代码

作者: climb    时间: 2016-5-13 23:35
cp0717 发表于 2016-4-25 22:15
好像可以用这种方式。
打印结果如下:
[aaa, aab, abc, baa, bba, bca, azz]

不错呀




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2