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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lh5484826 中级黑马   /  2015-8-28 12:24  /  731 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

打印结果是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);
        }

16 个回复

倒序浏览

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

把contains改成equals就行了
回复 使用道具 举报
氕氘氚 发表于 2015-8-28 12:30
把contains改成equals就行了

我改过了,没用。输出结果还是一样。
回复 使用道具 举报
那就改成
  1. if (str.contains(del)) {
  2.                                 aList.remove(str);
  3.                                 x--;
  4.                         }
复制代码
回复 使用道具 举报
看一下内存图你就知道了,删一个元素 会自动向后移动 这时候 索引值会全部向前-1 所以 会漏了四个
回复 使用道具 举报
如果是删除元素的话 contains 换成 equals 比较符合逻辑
回复 使用道具 举报
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:10
8#
每删除一个你的alist.size()长度就减少一个,而你的i值却加1,当循环四次时alise.size=8-4;i=4两个值相等就不满足for语句的条件了,所以就有一部分剩下了。
回复 使用道具 举报
SYAD 中级黑马 2015-8-28 14:59:37
9#
remove之后size发生了变化,需要把x回退,循环if中加个x--; 或者从后往前遍历
回复 使用道具 举报
你改一下
for (int i = x-1; i >= 0; i--) {
            if(!(aList.get(i).contains(del))){
        
                //判断条件。如果aList中的元素包含了你设定的字符串时,不将aList中的数据存放到temp容器中,(即变相删除,或者过滤)
        
                 aList.remove(str);
            }
        }
回复 使用道具 举报
  刚才发错了把if(!中!去掉
回复 使用道具 举报
昨天就是碰到这个问题,今天终于是解决了呢
回复 使用道具 举报
Boint 中级黑马 2015-8-28 23:47:39
13#
是这样的,比如,放第一个abc进去,索引0,再放第二个,第二个和第一个一样,丢掉,放第三个,然而第三个索引1,那么把第四个放进去,这时它所在的索引应该是2,它和索引1比,相同,那么丢掉,放第五个,这时第五个所在的索引2,然后不和索引1比,直接放第六个,和索引2相同,丢掉,放第七个,索引为3,也不和索引2比,最后放第八个,和索引3比,相同,丢掉,所以最后会打出3个abc
回复 使用道具 举报
Boint 中级黑马 2015-8-28 23:49:00
14#
Boint 发表于 2015-8-28 23:47
是这样的,比如,放第一个abc进去,索引0,再放第二个,第二个和第一个一样,丢掉,放第三个,然而第三个索 ...

纠正一下,最后写错了,是4个
回复 使用道具 举报
都是大神啊
回复 使用道具 举报
因为你在移除的时候集合的长度就变了啊,你可以改成int x=aList.size();x>0;x--
回复 使用道具 举报
8楼正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马