7
7
8
8
import Foundation
9
9
10
- public struct Multiset < T : Hashable > {
11
- fileprivate var storage : Dictionary < T , Int >
12
- private var _count : Int = 0
10
+ public struct Multiset < Element : Hashable > {
11
+ fileprivate var storage : [ Element : Int ]
12
+ private var _count = 0
13
13
14
14
public init ( ) {
15
- storage = Dictionary < T , Int > ( )
15
+ storage = [ : ]
16
16
}
17
17
18
- public mutating func add ( _ elem: T ) {
19
- if let currentCount = self . storage [ elem] {
20
- self . storage [ elem] = currentCount + 1 ;
18
+ public mutating func add ( _ elem: Element ) {
19
+ if let currentCount = storage [ elem] {
20
+ storage [ elem] = currentCount + 1 ;
21
21
} else {
22
- self . storage [ elem] = 1
22
+ storage [ elem] = 1
23
23
}
24
24
_count += 1
25
25
}
26
26
27
- public mutating func remove ( _ elem: T ) {
28
- if let currentCount = self . storage [ elem] {
27
+ public mutating func remove ( _ elem: Element ) {
28
+ if let currentCount = storage [ elem] {
29
29
if currentCount > 1 {
30
- self . storage [ elem] = currentCount - 1
30
+ storage [ elem] = currentCount - 1
31
31
} else {
32
- self . storage. removeValue ( forKey: elem)
32
+ storage. removeValue ( forKey: elem)
33
33
}
34
34
_count -= 1
35
35
}
36
36
}
37
37
38
- public func isSubSet ( of superset: Multiset < T > ) -> Bool {
39
- for (key, count) in self . storage {
38
+ public func isSubSet ( of superset: Multiset < Element > ) -> Bool {
39
+ for (key, count) in storage {
40
40
let supersetcount = superset. storage [ key] ?? 0
41
41
if count > supersetcount {
42
42
return false
@@ -46,30 +46,27 @@ public struct Multiset<T: Hashable> {
46
46
}
47
47
48
48
public var count : Int {
49
- get {
50
- return _count
51
- }
49
+ return _count
52
50
}
53
51
54
- public func count( for key: T ) -> Int {
55
- return self . storage [ key] ?? 0
52
+ public func count( for key: Element ) -> Int {
53
+ return storage [ key] ?? 0
56
54
}
57
55
58
- public var allItems : [ T ] {
59
- get {
60
- var result = Array < T > ( )
61
- for (key, count) in self . storage {
62
- for _ in 0 ..< count {
63
- result. append ( key)
64
- }
56
+ public var allItems : [ Element ] {
57
+ var result = Array < Element > ( )
58
+ for (key, count) in storage {
59
+ for _ in 0 ..< count {
60
+ result. append ( key)
65
61
}
66
- return result
67
62
}
63
+ return result
68
64
}
69
65
}
70
66
67
+ // MARK: - Equatable
71
68
extension Multiset : Equatable {
72
- public static func == ( lhs: Multiset < T > , rhs: Multiset < T > ) -> Bool {
69
+ public static func == ( lhs: Multiset < Element > , rhs: Multiset < Element > ) -> Bool {
73
70
if lhs. storage. count != rhs. storage. count {
74
71
return false
75
72
}
0 commit comments