| [#978] | project: api | priority: high | category: bug | |
|---|---|---|---|---|
| submitter | assigned to | status | date submitted | |
| Iulian | Martin | fixed | 2007-03-05 11:48:04.0 | |
| subject | HashSet bug: 'contains' is wrong about some elements | |||
| code |
class Foo(val n: Int) {
override def hashCode = n % 2 // pretty bad hash
override def equals(other: Any): Boolean = other match {
case f: Foo => f.n == n
case _ => false
}
override def toString = "" + n
}
object Main extends Application {
val set = new collection.mutable.HashSet[Foo]
// val set = new collection.jcl.HashSet[Foo]
val max = 200
for (val x <- 1 to max)
set += new Foo(x)
testRemove(2)
testExists(2)
def testRemove(m: Int) {
for (val x <- 1 to max; x % m == 0) {
val f = new Foo(x)
set -= f
assert(!(set contains f))
}
}
def testExists(m: Int) {
for (val x <- 1 to max; x % m == 1) {
val f = new Foo(x)
assert(set contains f, "For element: " + f + " set: " + set)
}
}
}
|
|||
| what happened | uneven element Foo(131) is not found in the set. (jcl.HashSet passes the test). I think the same problem makes '\ remove' not remove some elements (I couldn't find an small example to exhibit it, but it happened in my own code\ ). I made this a high-priority bug because the standard library is the last place you'd search for a bug (at lea\ st that's true for me). |
|||
| what expected | Correct behavior. | |||
| [back to overview] | ||||
| Iulian edited on 2007-03-05 11:48:36.0 |
| Martin edited on 2007-03-05 16:22:15.0 |