88 lines
1.6 KiB
JavaScript
88 lines
1.6 KiB
JavaScript
import Collection from './Collection'
|
|
import NoSuchElementException from './NoSuchElementException'
|
|
import UnsupportedOperationException from '../lang/UnsupportedOperationException'
|
|
import Set from './Set'
|
|
|
|
/**
|
|
* @see http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html
|
|
*/
|
|
export default class HashSet extends Set {
|
|
constructor(o) {
|
|
super()
|
|
this.map = new Map()
|
|
if (o instanceof Collection)
|
|
this.addAll(o)
|
|
}
|
|
|
|
contains(o) {
|
|
const hashCode = o.hashCode ? o.hashCode() : o
|
|
if (this.map.has(hashCode))
|
|
return true
|
|
return false
|
|
}
|
|
|
|
add(o) {
|
|
const hashCode = o.hashCode ? o.hashCode() : o
|
|
if (this.map.has(hashCode))
|
|
return false
|
|
return !!this.map.set(hashCode, o)
|
|
}
|
|
|
|
addAll(c) {
|
|
for (const e of c)
|
|
this.add(e)
|
|
return true
|
|
}
|
|
|
|
remove() {
|
|
throw new UnsupportedOperationException()
|
|
}
|
|
|
|
size() {
|
|
return this.map.size
|
|
}
|
|
|
|
isEmpty() {
|
|
return this.map.size === 0
|
|
}
|
|
|
|
toArray() {
|
|
return Array.from(this.map.values())
|
|
}
|
|
|
|
iterator() {
|
|
return new Iterator(this.map)
|
|
}
|
|
|
|
[Symbol.iterator]() {
|
|
return this.map
|
|
}
|
|
}
|
|
|
|
class Iterator {
|
|
constructor(map) {
|
|
this.iterator = map.values()
|
|
const { done, value } = this.iterator.next()
|
|
this.done = done
|
|
this.value = value
|
|
}
|
|
|
|
next() {
|
|
if (this.done)
|
|
throw new NoSuchElementException()
|
|
const current = this.value
|
|
const { done, value } = this.iterator.next()
|
|
this.done = done
|
|
this.value = value
|
|
return current
|
|
}
|
|
|
|
hasNext() {
|
|
return !this.done
|
|
}
|
|
|
|
remove() {
|
|
throw new UnsupportedOperationException()
|
|
}
|
|
}
|