Skip to content

Instantly share code, notes, and snippets.

@davidinga
Created June 5, 2019 22:04
Show Gist options
  • Save davidinga/6e6ed69c49fede21068d9c091b058e62 to your computer and use it in GitHub Desktop.
Save davidinga/6e6ed69c49fede21068d9c091b058e62 to your computer and use it in GitHub Desktop.
Hash Set implemented with a Hash Table that only stores Keys.
struct HashSet<Element: Hashable> {
private var set: HashTableOnlyKeys<Element>
var isEmpty: Bool {
return set.isEmpty
}
var count: Int {
return set.count
}
init(size: Int) {
set = HashTableOnlyKeys<Element>(size: size)
}
@discardableResult mutating func insert(_ element: Element) -> Bool {
if(set.contains(element) == nil) {
set.append(element)
return true
}
return false
}
@discardableResult mutating func remove(_ element: Element) -> Element? {
return set.remove(element)
}
mutating func removeAll() {
set.removeAll()
}
func contains(_ element: Element) -> Element? {
return set.contains(element)
}
func union(_ hashSet: HashSet<Element>) -> HashSet<Element> {
var union = HashSet<Element>(size: self.set.size + hashSet.set.size)
for element in self.set {
union.insert(element)
}
for element in hashSet.set {
union.insert(element)
}
return union
}
func intersection(_ hashSet: HashSet<Element>) -> HashSet<Element> {
var newSet = HashSet<Element>(size: self.set.size + hashSet.set.size)
for element in hashSet.set {
if self.set.contains(element) != nil {
newSet.insert(element)
}
}
return newSet
}
func difference(_ hashSet: HashSet<Element>) -> HashSet<Element> {
var newSet = HashSet<Element>(size: self.set.size + hashSet.set.size)
for element in self.set {
if hashSet.set.contains(element) == nil {
newSet.insert(element)
}
}
return newSet
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment