黑马程序员技术交流社区

标题: ArrayList问题,求解 [打印本页]

作者: lh5484826    时间: 2015-8-28 12:24
标题: ArrayList问题,求解
打印结果是4个"abc",为什么没有全部删除呢?

public static void main(String[] args) {
                ArrayList aList = new ArrayList();
                aList.add("abc");
                aList.add("abc");
                aList.add("abc");
                aList.add("abc");
                aList.add("abc");
                aList.add("abc");
                aList.add("abc");
                aList.add("abc");

                String del = "abc";

                for (int x = 0; x < aList.size(); x++) {
                        String str = (String) aList.get(x);
                        if (str.contains(del)) {
                                aList.remove(str);
                        }
                }
                System.out.println(aList);
        }

作者: 氕氘氚    时间: 2015-8-28 12:30

  1. if (str.equals(del)) {
  2.                                 aList.remove(str);
  3.                         }
复制代码

把contains改成equals就行了
作者: lh5484826    时间: 2015-8-28 12:37
氕氘氚 发表于 2015-8-28 12:30
把contains改成equals就行了

我改过了,没用。输出结果还是一样。
作者: 氕氘氚    时间: 2015-8-28 12:43
那就改成
  1. if (str.contains(del)) {
  2.                                 aList.remove(str);
  3.                                 x--;
  4.                         }
复制代码

作者: 毛豆豆    时间: 2015-8-28 13:27
看一下内存图你就知道了,删一个元素 会自动向后移动 这时候 索引值会全部向前-1 所以 会漏了四个
作者: 毛豆豆    时间: 2015-8-28 13:29
如果是删除元素的话 contains 换成 equals 比较符合逻辑
作者: vipsong    时间: 2015-8-28 14:03
aList.remove()删除一个,list集合就少一个,而你此时判断的变量还在继续自增。
所以会漏掉。
我的想法是建立个临时容器。
  1. package com.itheima.test;

  2. import java.util.ArrayList;

  3. public class test {

  4.     public static void main(String[] args) {
  5.         ArrayList<String> aList = new ArrayList<String>();
  6.         aList.add("abc1");
  7.         aList.add("abc2");
  8.         aList.add("abc3");
  9.         aList.add("abc4");
  10.         aList.add("abc5");
  11.         aList.add("abc6");
  12.         aList.add("abc7");
  13.         aList.add("abc8");
  14.         aList.add("aaa9");
  15.         ArrayList<String> temp = new ArrayList<String>();//临时容器
  16.         String del = "abc";
  17.         int x = aList.size();
  18.         
  19.         for (int i = 0; i < x; i++) {
  20.             if(!(aList.get(i).contains(del))){
  21.         
  22.                 //判断条件。如果aList中的元素包含了你设定的字符串时,不将aList中的数据存放到temp容器中,(即变相删除,或者过滤)
  23.         
  24.                 temp.add(aList.get(i));
  25.             }
  26.         }
  27.         aList.clear();//清空原有aList集合中数据
  28.         aList.addAll(temp);//将临时temp集合中的数据添加到aList中
  29.         System.out.println(aList);//打印,结果为aaa9
  30. }

  31. }
复制代码




作者: 荣斌    时间: 2015-8-28 14:54
每删除一个你的alist.size()长度就减少一个,而你的i值却加1,当循环四次时alise.size=8-4;i=4两个值相等就不满足for语句的条件了,所以就有一部分剩下了。
作者: SYAD    时间: 2015-8-28 14:59
remove之后size发生了变化,需要把x回退,循环if中加个x--; 或者从后往前遍历
作者: woshiku    时间: 2015-8-28 21:37
你改一下
for (int i = x-1; i >= 0; i--) {
            if(!(aList.get(i).contains(del))){
        
                //判断条件。如果aList中的元素包含了你设定的字符串时,不将aList中的数据存放到temp容器中,(即变相删除,或者过滤)
        
                 aList.remove(str);
            }
        }
作者: woshiku    时间: 2015-8-28 21:38
  刚才发错了把if(!中!去掉

作者: MilesMatheson    时间: 2015-8-28 22:47
昨天就是碰到这个问题,今天终于是解决了呢
作者: Boint    时间: 2015-8-28 23:47
是这样的,比如,放第一个abc进去,索引0,再放第二个,第二个和第一个一样,丢掉,放第三个,然而第三个索引1,那么把第四个放进去,这时它所在的索引应该是2,它和索引1比,相同,那么丢掉,放第五个,这时第五个所在的索引2,然后不和索引1比,直接放第六个,和索引2相同,丢掉,放第七个,索引为3,也不和索引2比,最后放第八个,和索引3比,相同,丢掉,所以最后会打出3个abc
作者: Boint    时间: 2015-8-28 23:49
Boint 发表于 2015-8-28 23:47
是这样的,比如,放第一个abc进去,索引0,再放第二个,第二个和第一个一样,丢掉,放第三个,然而第三个索 ...

纠正一下,最后写错了,是4个
作者: 没有如果    时间: 2015-8-29 00:17
都是大神啊
作者: 姜群    时间: 2015-8-29 00:26
因为你在移除的时候集合的长度就变了啊,你可以改成int x=aList.size();x>0;x--
作者: 至尊幽蓝    时间: 2015-8-29 08:25
8楼正解




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