【问题标题】:Remove User defined object from Java LinkedList Collection framework [duplicate]从 Java LinkedList Collection 框架中删除用户定义的对象 [重复]
【发布时间】:2017-09-14 17:34:55
【问题描述】:

我想从 Java LinkedList Collection 框架中删除用户定义的对象。下面的代码不会删除对象。我错过了什么?

import java.util.LinkedList;
import java.util.List;

public class MyObjectKeySearch {
    static class CMDTimeSlot{
        String comm;
        int orig;
        int prio;
        public  CMDTimeSlot(String comm,int orig,int prio){
            this.comm = comm;
            this.orig = orig;
            this.prio = prio;
        }

    }

public static void main(String a[]){
        List<CMDTimeSlot> cmdlist = new LinkedList<>();

        CMDTimeSlot one = new CMDTimeSlot("010D",2,2);
        CMDTimeSlot two = new CMDTimeSlot("0100",1,1);

        CMDTimeSlot three = new CMDTimeSlot("010C",3,3);

        cmdlist.add(one);
        cmdlist.add(two);
        cmdlist.add(three);

        for(CMDTimeSlot obj: cmdlist){
            System.out.println(obj.comm +" " + obj.orig +" "+obj.prio);
        }

        cmdlist.remove(new CMDTimeSlot("0100",1,1) );

        for(CMDTimeSlot obj: cmdlist){
            System.out.println(obj.comm +" " + obj.orig +" "+obj.prio);
        }
    }
}

输出::

010D 2 2 0100 1 1 010C 3 3

010D 2 2

0100 1 1 010C 3 3

【问题讨论】:

  • 你没有实现equals()hashCode(),所以remove()调用是比较对象身份,而不是对象值。
  • 如果我遍历链表并删除匹配的对象然后它的工作::for(CMDTimeSlot cmd: cmdlist){ if(cmd.comm.equalsIgnoreCase("0100")){ cmdlist.remove(命令); } }
  • 读取LinkedList.remove(Object o) 的javadoc删除具有最低索引的元素i 使得(o==null ? get(i)==null : o.equals(get(i)))(如果存在这样的元素)。 如您所见,您需要在您的类 CMDTimeSlot 上实现 equals() 以便它比较 comm 值。

标签: java collections


【解决方案1】:

使用 CMDTimeSlot 类的成员变量覆盖 equalshashcode 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多