import java.util.ArrayList;
import java.util.List;public class Check {
public static void main(String[] args){
List<User> list=new ArrayList();
User user=new User(1,"liuweimin");
User user2=new User(2,"baishuang");
User user3=new User(3,"zhangxiaolei");

list.add(user);
list.add(user2);
list.add(user3);

for(User result:list){
if(result.getId()==2){
list.remove(result);
}
System.out.println("id:"+result.getId()+"\tname:"+result.getName());
}
}
}我想根据id号来删除对象,当id为2的时候,我要删除当前的这个对象,可是我这样运行后得出的结果却是它把我第三个对象给删了,而不是我所要删除的第二个对象,请问我该怎么写,希望能解释的具体点,最好是能把改好后的代码发一下,谢谢了

解决方案 »

  1.   

    你删的对的
    打印的方式不对import java.util.ArrayList;
    import java.util.List;public class Check {
    public static void main(String[] args) {
    List<User> list = new ArrayList();
    User user = new User(1, "liuweimin");
    User user2 = new User(2, "baishuang");
    User user3 = new User(3, "zhangxiaolei"); list.add(user);
    list.add(user2);
    list.add(user3); for (User result : list) {
    if (result.getId() == 2) {
    list.remove(result);
    System.out.println("删除:");
    System.out.println("id:" + result.getId() + "\tname:"
    + result.getName());
    }
    }
    System.out.println("剩下:");
    for (User result : list) {
    System.out.println("id:" + result.getId() + "\tname:"
    + result.getName());
    }
    }
    }
      

  2.   

    list.remove(result);  你是直接remove的指定对象  肯定是正确的
      

  3.   

    1L说了,打印的问题,删除是对的
    for(User result:list){
        if(result.getId()==2){ //当id=2时for循环还没有结束,result继续取下一个,下一个id是3不会进入if,此时result就不是被删除的那个了
        list.remove(result);
    }
    System.out.println("id:"+result.getId()+"\tname:"+result.getName());
      

  4.   

    userid应该是唯一的吧,如果是的话删除后跳出循环就行了。if(result.getId()==2){
        list.remove(result);
        break;
    }你是想打印被删除的数据吧。如果是的话在循环里面打印if(result.getId()==2){
        list.remove(result);
        System.out.println("id:"+result.getId()+"\tname:"+result.getName());
        break;
    }
      

  5.   

    别忘了,list集合的长度是可申缩的,不是像数组那样位置还保留着
      

  6.   

    情况很复杂。
    if(result.getId()==2){
    list.remove(result);
    }
    如果条件改为==1,或者==3都会抛出 java.util.ConcurrentModificationException异常。
    当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 很不解,等高手解释
      

  7.   

    User delUser = new User();
    delUser.setI(4);
    list.remove(delUser);
    System.out.println(list);修改 equals、hashcode方法当i相同对象相同即可
      

  8.   


    用for-each遍历 实际上使用的是Iterator迭代器
    Iterator的工作机制:
    Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的。Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。建议解决方法:
    1、再定义一个List,用来保存需要删除的对象:
    修改部分代码:
     List<User> userRemove = new ArrayList<User>();
            //找出要删除的用户
            System.err.println("要删除的用户:");
            for (User result : list)
            {
                if (result.getId() == 1 || result.getId() == 3)
                {
                    userRemove.add(result);                System.err.println("id:" + result.getId() + "\tname:" + result.getName());
                }
            }
            list.removeAll(userRemove);        //剩下的用户
            System.err.println("剩下的用户:");
            for (User result : list)
            {
                System.err.println("id:" + result.getId() + "\tname:" + result.getName());
            }2,不用for-each循环,用原始的书写方式: 此方式如果按对象删除可以如下写、如果想按索引来删除 请倒叙循环
    for (int i = 0; i < list.size(); i++)
                    {
                        User result = list.get(i);
                        if (result.getId() == 3)
                        {
                            list.remove(result);
                            System.err.println("id: " + result.getId() + "\tname: " + result.getName());
                        }
                    }3、用迭代器删除
    Iterator<User> it = list.iterator();
            while (it.hasNext())
            {
                User userObj = it.next();
                if (userObj.getId() == 3)
                {
                    it.remove();
                }
            }
            //剩下的用户
            System.err.println("剩下的用户:");
            for (User result : list)
            {
                System.err.println("id:" + result.getId() + "\tname:" + result.getName());
            }三种方式 任你选择 看你喜欢
      

  9.   

     找到后 使用  remove 方法就有了
      

  10.   

    其实不必写循环,重写User类中的equals()方法,然后直接使用 list.remove(user2);即可@Override
    public boolean equals(Object obj) {
    if (this == obj)
    return true;
    if (obj == null)
    return false;
    if (getClass() != obj.getClass())
    return false;
    final User other = (User) obj;
    if (id != other.getId())
    return false;
    return true;
    }
      

  11.   


    这样删除是不行的,同学,会报 java.util.ConcurrentModificationException异常。
    要通过Iterator迭代删除才不会有问题!
      

  12.   

    3、用迭代器删除
    Iterator<User> it = list.iterator();
      while (it.hasNext())
      {
      User userObj = it.next();
      if (userObj.getId() == 3)
      {
      it.remove();
      }
      }
      //剩下的用户
      System.err.println("剩下的用户:");
      for (User result : list)
      {
      System.err.println("id:" + result.getId() + "\tname:" + result.getName());
      }
    楼上说的。 1楼的那种的确会报 java.util.ConcurrentModificationException 异常的
      

  13.   

    还没结贴????接12楼
    重写Bean
    @Override
    public String toString() {
    // TODO Auto-generated method stub
    return "i:"+i+",string:"+this.string;
    }
    @Override
    public boolean equals(Object obj) {
    User u=null;
    if(obj instanceof User)
    u=(User) obj;
    return u.getI()==this.i;
    }
    @Override
    public int hashCode() {
    // TODO Auto-generated method stub
    return super.hashCode();
    }
      

  14.   

    是嘛? 看出来了?       ___ __ 
         _{___{__}\
        {_}      `\)            
       {_}        `            _.-''''--.._
       {_}                    //'.--.  \___`.
        { }__,_.--~~~-~~~-~~-::.---. `-.\  `.)
         `-.{_{_{_{_{_{_{_{_//  -- 8;=- `
            `-:,_.:,_:,_:,.`\\._ ..'=- , 
                // // // //`-.`\`   .-'/
               << << << <<    \ `--'  /----)
                ^  ^  ^  ^     `-.....--'''
      

  15.   

    Email:[email protected]  你的邮箱 ?
    你叫孙军强啊--|     
    问题回答的不错
      

  16.   

    大家都挺不错的 ( ⊙o⊙ )哇O(∩_∩)O哈哈~