@@ -23,6 +23,13 @@ extension String {
23
23
struct Player : Comparable {
24
24
var name : String ! = String . random ( )
25
25
var points = randomNum ( 0 , max: 5000 )
26
+
27
+ init ( name: String , points: Int ) {
28
+ self . name = name
29
+ self . points = points
30
+ }
31
+
32
+ init ( ) { }
26
33
}
27
34
28
35
// == operator for struct Player
@@ -42,6 +49,12 @@ func print(player: Player){
42
49
print ( " Player: \( player. name) | Points: \( player. points) " )
43
50
}
44
51
52
+ func print( set: OrderedSet < Player > ) {
53
+ for i in 0 ..< set. count {
54
+ print ( set [ set. count - i - 1 ] )
55
+ }
56
+ }
57
+
45
58
import Foundation
46
59
47
60
// An Ordered Set is a collection where all items in the set follow an ordering, usually ordered from
@@ -94,7 +107,7 @@ public struct OrderedSet<T: Comparable> {
94
107
// returns true if and only if the item exists somewhere in the set
95
108
public func exists( item: T ) -> Bool {
96
109
let index = findIndex ( item)
97
- return index != - 1 && internalSet [ index ] == item
110
+ return index != - 1
98
111
}
99
112
100
113
// returns the index of an item if it exists, otherwise returns -1.
@@ -110,13 +123,38 @@ public struct OrderedSet<T: Comparable> {
110
123
} else if internalSet [ mid] < item {
111
124
leftBound = mid + 1
112
125
} else {
113
- return mid
126
+ // check the mid value to see if it is the item we are looking for
127
+ if internalSet [ mid] == item {
128
+ return mid
129
+ }
130
+
131
+ var j = mid
132
+
133
+ // check right side of mid
134
+ while j < internalSet. count - 1 && !( internalSet [ j] < internalSet [ j + 1 ] ) {
135
+ if internalSet [ j + 1 ] == item {
136
+ return j + 1
137
+ }
138
+
139
+ j++
140
+ }
141
+
142
+
143
+ // check right side of mid
144
+ while j > 0 && !( internalSet [ j] < internalSet [ j - 1 ] ) {
145
+ if internalSet [ j - 1 ] == item {
146
+ return j - 1
147
+ }
148
+
149
+ j--
150
+ }
151
+ return - 1
114
152
}
115
153
}
116
154
117
155
return - 1
118
156
}
119
-
157
+
120
158
// returns the item at the given index. assertion fails if the index is out of the range
121
159
// of [0, count)
122
160
public subscript( index: Int ) -> T {
@@ -185,9 +223,7 @@ for _ in 0..<20 {
185
223
playerSet. insert ( anotherPlayer)
186
224
187
225
// print all players in order
188
- for i in 0 ..< playerSet. count {
189
- print ( playerSet [ playerSet. count - i - 1 ] )
190
- }
226
+ print ( playerSet)
191
227
192
228
193
229
// highest and lowest players:
@@ -199,13 +235,27 @@ print("'Another Player (\(anotherPlayer.name))' is ranked at level: \(playerSet.
199
235
200
236
201
237
238
+ // Example with multiple entries with the same value
202
239
240
+ var repeatedSet = OrderedSet < Player > ( )
203
241
242
+ repeatedSet. insert ( Player ( name: " Player 1 " , points: 100 ) )
243
+ repeatedSet. insert ( Player ( name: " Player 1 " , points: 100 ) )
244
+ repeatedSet. insert ( Player ( name: " Player 2 " , points: 100 ) )
245
+ repeatedSet. insert ( Player ( name: " Player 3 " , points: 100 ) )
246
+ repeatedSet. insert ( Player ( name: " Player 4 " , points: 100 ) )
247
+ repeatedSet. insert ( Player ( name: " Player 5 " , points: 100 ) )
248
+ repeatedSet. insert ( Player ( name: " Player 6 " , points: 50 ) )
249
+ repeatedSet. insert ( Player ( name: " Player 7 " , points: 200 ) )
250
+ repeatedSet. insert ( Player ( name: " Player 8 " , points: 250 ) )
251
+ repeatedSet. insert ( Player ( name: " Player 9 " , points: 25 ) )
204
252
253
+ print ( repeatedSet)
205
254
206
-
207
-
208
-
255
+ // find player 5
256
+ print ( repeatedSet. findIndex ( Player ( name: " Player 5 " , points: 100 ) ) )
257
+ print ( repeatedSet. findIndex ( Player ( name: " Random Player " , points: 100 ) ) )
258
+ print ( repeatedSet. findIndex ( Player ( name: " Player 5 " , points: 1000 ) ) )
209
259
210
260
211
261
0 commit comments