【问题标题】:How do define my own element class for use with Set如何定义我自己的元素类以与 Set 一起使用
【发布时间】:2011-03-11 22:23:42
【问题描述】:

我有以下代码:

public class MyElement {
    String name;
    String type;

    MyElement(String name, String type) {
        this.name = name;
        this.type = type;
    }
}

public class Test {

    public static void main(String[] args) {
        Set<MyElement> set = new HashSet<MyElement>();
        set.add(new MyElement("foo", "bar"));
        set.add(new MyElement("foo", "bar"));
        set.add(new MyElement("foo", "bar"));
        System.out.println(set.size());
        System.out.println(set.contains(new MyElement("foo", "bar")));
    }
}

执行时返回:

3

false

我本来希望结果为 1 且为真。为什么我的元素不被认为是相同的,我该如何纠正这个问题? 谢谢, 韦恩。

【问题讨论】:

    标签: java set


    【解决方案1】:

    您需要根据一般合同在 MyElement 上实施 equals(Object o)hashCode()。如果没有 Set.contains() 将使用比较对象的内存地址的默认实现。由于您在 contains 调用中创建了 MyElement 的新实例,因此它返回为 false。

    【讨论】:

    • 谢谢,成功了。我的最终代码是: public class MyElement { String name;字符串类型; MyElement(字符串名称,字符串类型){ this.name = name; this.type = 类型; } public boolean equals(Object object) { MyElement myElement = (MyElement) object;返回 this.name.equals(myElement.name) && this.type.equals(myElement.type); } public int hashCode() { return (name + type).hashCode(); } }
    【解决方案2】:

    你应该重写一个 equals(MyElement me) 函数。等于返回一个布尔值

    否则,您正在检查两个项目是否是一个对象的同一个实例,而不是它们的内部内容是否相同。

    MyElement(String name, String type) {
        this.name = name;
        this.type = type;
    }
    
    public boolean Equals<MyElement>(MyElement me) {
        return this.name.equals(me.name) && this.type.equals(me.type);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      相关资源
      最近更新 更多