2014-01-13 95 views
1

下面的代码是不是给我,我期待的结果:问题与“包含” HashSet的方法(JAVA)

public static void main (String[] args) { 

    Set<Pair> objPair = new LinkedHashSet<Pair>(); 
    objPair.add(new Pair(1, 0)); 

    System.out.println("Does the pair (1, 0) exists already? "+objPair.contains(new Pair(1, 0))); 

} 

private static class Pair { 

    private int source; 
    private int target; 

    public Pair(int source, int target) { 
     this.source = source; 
     this.target = target; 
    }   
} 

结果将是:

Does the pair (1, 0) exists already? false 

我不能理解为什么它不起作用。 或者,也许我正在使用“包含”方法错误(或错误的原因)。

也有另一种问题, 如果我添加相同值的两倍,它会被接受,甚至是一套

objPair.add(new Pair(1, 0)); 
objPair.add(new Pair(1, 0)); 

它不会接受/识别类对我产生的?

在此先感谢。

+1

'HashSet'可与散列码哪里是你的'的hashCode() '执行? –

+0

哦,是的,我是新来的,我可能需要更多地研究它:) 非常感谢你! –

回答

2

没有自己的hashCode()实现,的Java考虑两个Pair对象相等,只有当他们是完全相同的对象new,顾名思义,总是会创建一个“新”的对象。在你的情况下,如果Pair对象具有sourcetarget的相同值,那么你需要认为它们是相等的 - 要做到这一点,你需要告诉Java如何测试Pair对象是否相等。 (并且使哈希映射工作,你所期望的方式,你还需要生成一个散列码是符合等于 - 严格地讲,这意味着相等的对象必须产生相同的hashCode,和不相等的对象应该 。产生不同的散列码

大多数IDE会产生像样的hashCode()方法和equals()方法,你矿产生这样的:

@Override 
    public int hashCode() { 
     int hash = 3; 
     hash = 47 * hash + this.source; 
     hash = 47 * hash + this.target; 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
     return false; 
     } 
     if (getClass() != obj.getClass()) { 
     return false; 
     } 
     final Pair other = (Pair) obj; 
     if (this.source != other.source) { 
     return false; 
     } 
     if (this.target != other.target) { 
     return false; 
     } 
     return true; 
    } 
+0

不能相信这只是“只”这个:)猜我忘了提及我在Java新(你们注意到,虽然...)非常感谢! –

+0

我们都是新的......。 :) – JVMATL

+1

@NyanMaru建议阅读,如果你会做很多的Java:http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683/ - 本书中的第9项涵盖' hashCode'和'equals' - 我每隔几年就会重读一次这本书,并且每次都会学到一些新的东西,并在第二版出版后购买。 – JVMATL

4

您需要在您的Pair课程中覆盖您的hashCodeequals方法。 LinkedHashSet(以及其他使用散列码的Java对象)将使用它们来查找并找到您的Pair对象。

+0

非常感谢! –