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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© adamjy 中级黑马   /  2014-4-8 01:23  /  1352 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. List<String> a = new ArrayList<String>();
  2. a.add("foo");
  3. a.add("john");
  4. a.add("adam");
  5. a.add("bar");

  6. for (int i = 0; i < a.size(); i++)
  7. {
  8.     String str = a.get(i);
  9.     if (!str.equals("foo") || !str.equals("bar")) a.remove(str);
  10. }
复制代码

以上代码,删除“john”后,“adam”会跳到List中索引为1的位置。所以,“adam”会被跳过不删除。
如果用以下代码,
  1. List<String> a = new ArrayList<String>();
  2. a.add("foo");
  3. a.add("john");
  4. a.add("adam");
  5. a.add("bar");

  6. for (int i = 0; i < a.size(); i++)
  7. {
  8.     String str = a.get(i);
  9.     boolean removed = false;
  10.     if (!str.equals("foo") || !str.equals("bar"))
  11.     {
  12.         a.remove(str);
  13.         removed = true;
  14.     }
  15.     if (removed) i--;
  16. }
复制代码


这样代码又不是很规范,请问有其他更有效率的方法从List中移除元素吗?

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

3 个回复

倒序浏览
使用迭代器,具体实现代码如下:(另外,楼主的 if(!str.equals("foo") || !str.equals("bar"))应该用&&连接吧)

  1. import java.util.*;

  2. public class test01 {
  3.         public static void main(String[] args){
  4.                 List<String> a = new ArrayList<String>();
  5.                 a.add("foo");
  6.                 a.add("john");
  7.                 a.add("adam");
  8.                 a.add("bar");
  9.                
  10.                 Iterator<String> it=a.iterator();
  11.                 while(it.hasNext())
  12.                 {
  13.                         String str=it.next();
  14.                         if(!str.equals("foo") && !str.equals("bar"))
  15.                                 it.remove();
  16.                 }
  17.                 for(String list:a){
  18.                         System.out.println(list);
  19.                 }
  20.         }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
List<String> a = new ArrayList<String>();
a.add("foo");
a.add("john");
a.add("adam");
a.add("bar");

for (int i = a.size()-1; i >=0; i--)
{
    String str = a.get(i);
    if (!str.equals("foo") || !str.equals("bar"))
    {
        a.remove(str);
    }
}

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
import java.util.*;

public class test01 {
        public static void main(String[] args){
                List<String> a = new ArrayList<String>();
                a.add("foo");
                a.add("john");
                a.add("adam");
                a.add("bar");
               
                Iterator<String> it=a.iterator();
                while(it.hasNext())
                {
                        String str=it.next();
                        if(!str.equals("foo") && !str.equals("bar"))
                                it.remove();
                }
                for(String list:a){
                        System.out.println(list);
                }
        }
}



这样写才是正解   Iterator免去手动操作元素的下标,避免低级的程序错误

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马