包含并删除列表中用户定义的类的实例的方法?

时间:2013-06-28 01:07:29

标签: java

所以我有这段代码:

List<MyDataType> test = map.get(id)
MyDataType test1 = new MyDataType("XXX", 1); 
System.out.println(test.contains(test1)); // returns false
System.out.println(test.get(0).equals(test1)); // returns true
System.out.println(test.remove(test1)); // returns false 
System.out.println(test); // still the original list

我已经覆盖了MyDataType中的.equals.hashCode()方法,并且它是一致的。此外,map的类型为ListMultimap<Long, DestQuanTuple>(忘记在我的OP中提及此内容)。但是,电话: map.remove(sourceContainerId, test1)也不会修改test

MyDataType类:

public class MyDataType implements Comparable<MyDataType> {
    private String destination;
    private int quantity;

    // Constructor initializes destination and quantity

    // Getters exist to get destination and quantity

    public boolean equals (MyDataType other) {
        boolean destinationSame = false, quantitySame = false;
        destinationsame = this.getDestination().equals(other.getDestination());
        Integer thisQuantity = (Integer) this.getQuantity();
        Integer otherQuantity = (Integer) other.getQuantity();
        quantitySame = thisQuantity.equals(otherQuantity);
        return destinationSame && quantitySame;
    }

    public int hashCode() {
        return destination.hashCode() + quantity;
    }

    public int compareTo(MyDataType other) {
        Integer myQuantity = this.getQuantity();
        if (myQuantity.compareTo(other.getQuantity()) != 0) {
            return myQuantity.compareTo(otherTuple.getQuantity());
        }
        else {
            return this.getDestination().compareTo(otherTuple.getDestination());
        }
    }
}

知道为什么我没有得到我想要的功能吗?

3 个答案:

答案 0 :(得分:2)

您遇到的问题是您必须定义equalshashCode一致

  

boolean contains(Object o)

     

如果此列表包含,则返回true   指定的元素。更正式的是,当且仅当这样时才返回true   列表包含至少一个元素e,以便(o==null ? e==null : o.equals(e))

合同为a.equals(b), then a.hashCode() must be same as b.hashCode().

结论,您必须覆盖equalshashCode

<强>更新

 public boolean equals (MyDataType other) {

 }

一定是,

 @Override
 public boolean equals (Object other) {

 }

请注意,如果您使用覆盖注释,那么如果您有错误将无法编译,那么请使用注释!

你正在超载等于这通常不是必要的,因为它很难保持,并且在你的情况下,意外的行为成为集合使用默认equals(Object o),这就是为什么你有这个。

答案 1 :(得分:1)

您没有覆盖equals()方法,实际上是超载它。

更改签名 -

@Override
public boolean equals (Object other) {

以下是正在发生的事情 -

System.out.println(test.contains(test1)); // returns false

false,因为内部调用的方法是equals(Object obj)

System.out.println(test.get(0).equals(test1)); // returns true

是的,因为您正在调用方法equals(MyDataType other)

System.out.println(test.remove(test1)); // returns false 

false,因为内部调用的方法是equals(Object obj)

答案 2 :(得分:0)

我假设测试应该包含值为XXX和1的MyDataType?

如果是这样,您可能需要覆盖MyDataType的equals()方法,以便List.Contains()和List.Remove()在列表中查找MyDataType。如果MyDataTypes都指向内存中的同一对象,则默认的equals()方法将仅返回true。