A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yhnan 中级黑马   /  2013-4-12 12:01  /  1929 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 易贺男 于 2013-4-12 16:20 编辑

fill将集合中所有元素替换成指定元素
练习;将list集合中部分元素替换成指定元素
思路;list集合中有subList方法。用此方法获取子集合,将子集合替换成指定元素
2、将元集合中被替换的元素删除
3、用addAll方法将替换好的子集合插入到原来的位置
  1. import java.util.*;

  2. class FillDemo
  3. {
  4.         public static void main(String[] args)

  5.         {
  6.                 ArrayList<String> al = new ArrayList<String>();
  7.                 al.add("safgadd");
  8.                 al.add("add");
  9.                 al.add("safgd");
  10.                 al.add("safga");
  11.                 al.add("fgadd");
  12.                 al.add("afgaddju");
  13.                 fillTast(al,2,5,"kk");
  14.         }
  15.         public static <T>void fillTast(List<T> li,int from,int end,T key)
  16.         {
  17.                 List<T> ls = li.subList(from,end);//取子集
  18.                 ls = Collections.fill(ls,key);//这步老是提示说需要List<T>找到void 可是我怎么改都有这句话。脑子已经木了 实在找不到方法解决
  19.                 for (int x=from ,y=end;x<y ;x++ )
  20.                 {
  21.                         li.remove(x);
  22.                 }
  23.                 li.addAll(ls);
  24.                 Iterator<T> it = li.iterator();
  25.                 while (it.hasNext())
  26.                 {
  27.                         T t = it.next();
  28.                 }
  29.                 System.out.println(t.toString());
  30.         }
  31. }
复制代码
各位给看看   到底该怎么弄

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

17 个回复

倒序浏览
真心求解   别给我整沉了啊版主~  我不要分   我就希望谁给我个答案
回复 使用道具 举报
楼主,你这程序写的,有点猛啊。
我给你找几处问题,你再重新写吧。
第一,你注释上的问题,是因为Collections.fill(ls,key);是无返回值的函数。你用list接收,所以错了。
第二,程序31行,用了while中的局部变量。
第三,Collections.fill(ls,key);这个方法是替换现有集合中所有元素。所以,第一个问题解决后,会出现越界异常。
第四,addAll()方法,按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。如果正在进行此操作时修改指定的 collection ,那么此操作的行为是不确定的。所以,即使第三个问题也解决了之后,又出现了并发修改异常。
貌似楼主要提高查阅api的能力才行,建议再仔细复习毕老师的视频。希望对你有帮帮助。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
黑马伍哲沂 发表于 2013-4-12 14:19
楼主,你这程序写的,有点猛啊。
我给你找几处问题,你再重新写吧。
第一,你注释上的问题,是因为Collecti ...

谢谢指点  我后来自己又看了一遍 1、2、3、都看出来了 ,虽然代码都改了,也运行出了结果,但就是不知道addAll为什么会并发修改。现在貌似知道了,太谢谢了。哈哈。自己也觉得这个代码太烂了
回复 使用道具 举报
黑马伍哲沂 发表于 2013-4-12 14:19
楼主,你这程序写的,有点猛啊。
我给你找几处问题,你再重新写吧。
第一,你注释上的问题,是因为Collecti ...

怎么会出现角标越界呢?我在collections.fill()语句遍历li集合中的元素,打印出来的是
safgadd add kk kk kk afgaddju这六个元素啊
回复 使用道具 举报
李罡 发表于 2013-4-12 17:18
怎么会出现角标越界呢?我在collections.fill()语句遍历li集合中的元素,打印出来的是
safgadd add kk kk ...

因为用了collections.fill()之后就只有三个元素了,而接下来的for循环里用的x=from,y=end。mian中调用时传进来的值分别是2,5。所以x<end就是4,而实际元素只有三个。  可以在collections.fill()之后用打印语句System.out.println(ls);看看。
回复 使用道具 举报
李罡 中级黑马 2013-4-12 17:48:47
7#
黑马伍哲沂 发表于 2013-4-12 17:36
因为用了collections.fill()之后就只有三个元素了,而接下来的for循环里用的x=from,y=end。mian中调用时 ...

for循环里面用的是li.remove()啊,是li不是ls!用collections.fill()语句后,ls集合里面是三个元素,但是li集合里面是六个元素啊!直接打印System.out.println(li)得到六个元素,怎么会角标越界呢
回复 使用道具 举报
易贺男 发表于 2013-4-12 14:03
真心求解   别给我整沉了啊版主~  我不要分   我就希望谁给我个答案

这是失误。。。。我本来要上升的,搞错了。。。。真心不是故意的
回复 使用道具 举报
李罡 发表于 2013-4-12 17:48
for循环里面用的是li.remove()啊,是li不是ls!用collections.fill()语句后,ls集合里面是三个元素,但是 ...

嗯 ,对。  你不说我还真没想到什么原因。  
我也打印了li  结果确实是你说的那样。
但越界的原因是因为,ArrayList是数组实现的链表,在进行删除的时候,后面的数据会前移。
当删除了前面的一部分数据后,后面在删除高角标的元素就越界了。比如删除了角标为0的元素,那么角标为5的元素就变成了角标4.


未命名2.jpg (69.63 KB, 下载次数: 7)

未命名2.jpg
回复 使用道具 举报
黑马伍哲沂 发表于 2013-4-12 18:10
嗯 ,对。  你不说我还真没想到什么原因。  
我也打印了li  结果确实是你说的那样。
但越界的原因是因为 ...

这个。。。我竟然会犯这种错误,你当我不存在好了。。。
回复 使用道具 举报
李罡 发表于 2013-4-12 18:32
这个。。。我竟然会犯这种错误,你当我不存在好了。。。

哈哈 犯错好正常的啦  我开始也没仔细看什么原因。你不说的话,我也忽略掉了。
回复 使用道具 举报
易贺男 发表于 2013-4-12 16:19
谢谢指点  我后来自己又看了一遍 1、2、3、都看出来了 ,虽然代码都改了,也运行出了结果,但就是不知道a ...

多写写程序,自然就好了。大家都有这么个阶段,坚持学习就好。
回复 使用道具 举报
黑马伍哲沂 发表于 2013-4-12 18:48
多写写程序,自然就好了。大家都有这么个阶段,坚持学习就好。

你说的那个并发修改异常,我觉得只要addAll()语句不在遍历循环while()里面,是不会出现这种异常的。
回复 使用道具 举报
yhnan 中级黑马 2013-4-12 19:32:33
14#
冯海霞 发表于 2013-4-12 17:52
这是失误。。。。我本来要上升的,搞错了。。。。真心不是故意的

哦   还好还好 。。。我还以为问了太幼稚的问题呢,现在算是找回点自信
回复 使用道具 举报
李罡 发表于 2013-4-12 18:51
你说的那个并发修改异常,我觉得只要addAll()语句不在遍历循环while()里面,是不会出现这种异常的。 ...

还是你比较细心。
如图,这个异常中午运行时确实发生的。
原因是两次用了li.addAll(ls);(如图中前两行代码或者直接调用两次li.addAll(ls);)
但我也不明白,为什么两次调用这个就会发生这个异常。
我尝试过另外新建了一个ArrayList,用li反复调用这个方法并传入新建的ArrayList都没有问题。
你看看能不能找到是什么原因。


未命名3.jpg (49.72 KB, 下载次数: 5)

未命名3.jpg
回复 使用道具 举报
黑马伍哲沂 发表于 2013-4-12 20:54
还是你比较细心。
如图,这个异常中午运行时确实发生的。
原因是两次用了li.addAll(ls);(如图中前两行 ...

嗯,连续用了两次li.addAll(ls)就会出现异常,按理应该输出true。
我这也是,用了for循环就出现异常,不用for就不出现异常。
查API文档也没找出什么原因,看来得深入到jvm运行机制了
回复 使用道具 举报
李罡 发表于 2013-4-12 21:34
嗯,连续用了两次li.addAll(ls)就会出现异常,按理应该输出true。
我这也是,用了for循环就出现异常,不 ...

你是说这个语句前面这个for循环么?我一直是注释掉的,也一样会这样啊?
回复 使用道具 举报
黑马伍哲沂 发表于 2013-4-12 21:57
你是说这个语句前面这个for循环么?我一直是注释掉的,也一样会这样啊? ...

是啊,用了for循环后面再接个addAll()就出异常了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马