Skip to content

Commit 7442fd5

Browse files
committed
Merge pull request kodecocodes#28 from chris-pilcher/Select-Minimum-Maximum
Handling empty lists when selecting minimum maximum
2 parents 9823476 + 4e92997 commit 7442fd5

File tree

8 files changed

+72
-15
lines changed

8 files changed

+72
-15
lines changed

Select Minimum Maximum/Maximum.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
/*
22
Finds the maximum value in an array in O(n) time.
3-
The array must not be empty.
43
*/
54

65
func maximum<T: Comparable>(var array: [T]) -> T? {
6+
guard !array.isEmpty else {
7+
return nil
8+
}
9+
710
var maximum = array.removeFirst()
811
for element in array {
912
maximum = element > maximum ? element : maximum

Select Minimum Maximum/Minimum.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
/*
22
Finds the minimum value in an array in O(n) time.
3-
The array must not be empty.
43
*/
54

65
func minimum<T: Comparable>(var array: [T]) -> T? {
6+
guard !array.isEmpty else {
7+
return nil
8+
}
9+
710
var minimum = array.removeFirst()
811
for element in array {
912
minimum = element < minimum ? element : minimum

Select Minimum Maximum/MinimumMaximumPairs.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
/*
22
Finds the maximum and minimum value in an array in O(n) time.
3-
The array must not be empty.
43
*/
54

6-
func minimumMaximum<T: Comparable>(var array: [T]) -> (minimum: T, maximum: T)
5+
func minimumMaximum<T: Comparable>(var array: [T]) -> (minimum: T, maximum: T)?
76
{
7+
guard !array.isEmpty else {
8+
return nil
9+
}
10+
811
var minimum = array.first!
912
var maximum = array.first!
1013

Select Minimum Maximum/README.markdown

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ Here is a simple implementation in Swift:
2424

2525
```swift
2626
func minimum<T: Comparable>(var array: [T]) -> T? {
27+
guard !array.isEmpty else {
28+
return nil
29+
}
30+
2731
var minimum = array.removeFirst()
2832
for element in array {
2933
minimum = element < minimum ? element : minimum
@@ -32,6 +36,10 @@ func minimum<T: Comparable>(var array: [T]) -> T? {
3236
}
3337

3438
func maximum<T: Comparable>(var array: [T]) -> T? {
39+
guard !array.isEmpty else {
40+
return nil
41+
}
42+
3543
var maximum = array.removeFirst()
3644
for element in array {
3745
maximum = element > maximum ? element : maximum
@@ -71,8 +79,12 @@ The result is a minimum of `3` and a maximum of `9`.
7179
Here is a simple implementation in Swift:
7280

7381
```swift
74-
func minimumMaximum<T: Comparable>(var array: [T]) -> (minimum: T, maximum: T)
82+
func minimumMaximum<T: Comparable>(var array: [T]) -> (minimum: T, maximum: T)?
7583
{
84+
guard !array.isEmpty else {
85+
return nil
86+
}
87+
7688
var minimum = array.first!
7789
var maximum = array.first!
7890

@@ -109,7 +121,7 @@ Put this code in a playground and test it like so:
109121

110122
```swift
111123

112-
let result = minimumMaximum(array)
124+
let result = minimumMaximum(array)!
113125
result.minimum // This will return 3
114126
result.maximum // This will return 9
115127
```

Select Minimum Maximum/SelectMinimumMaximum Tests/SelectMinimumMaximumTests/MaximumTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ class MaximumTests: XCTestCase {
3535
XCTAssertEqual(result, 9)
3636
}
3737

38+
func testMaximumGivenAnEmptyList() {
39+
let array = [Int]()
40+
41+
let result = maximum(array)
42+
43+
XCTAssertNil(result)
44+
}
45+
3846
func testMaximumMatchesSwiftLibraryGivenARandomList() {
3947
for _ in 0...10 {
4048
for n in 1...100 {

Select Minimum Maximum/SelectMinimumMaximum Tests/SelectMinimumMaximumTests/MinimumTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ class MinimumTests: XCTestCase {
3535
XCTAssertEqual(result, 3)
3636
}
3737

38+
func testMinimumGivenAnEmptyList() {
39+
let array = [Int]()
40+
41+
let result = minimum(array)
42+
43+
XCTAssertNil(result)
44+
}
45+
3846
func testMinimumMatchesSwiftLibraryGivenARandomList() {
3947
for _ in 0...10 {
4048
for n in 1...100 {

Select Minimum Maximum/SelectMinimumMaximum Tests/SelectMinimumMaximumTests/SelectMinimumMaximumTests.swift

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class SelectMinimumMaximumTests: XCTestCase {
66
func testMinimumAndMaximumGivenAListContainingOneElement() {
77
let array = [ 8 ]
88

9-
let result = minimumMaximum(array)
9+
let result = minimumMaximum(array)!
1010

1111
XCTAssertEqual(result.minimum, 8)
1212
XCTAssertEqual(result.maximum, 8)
@@ -15,7 +15,7 @@ class SelectMinimumMaximumTests: XCTestCase {
1515
func testMinimumAndMaximumGivenAListContainingMultipleElementsWithTheSameValue() {
1616
let array = [ 8, 16, 8, 8 ]
1717

18-
let result = minimumMaximum(array)
18+
let result = minimumMaximum(array)!
1919

2020
XCTAssertEqual(result.minimum, 8)
2121
XCTAssertEqual(result.maximum, 16)
@@ -24,7 +24,7 @@ class SelectMinimumMaximumTests: XCTestCase {
2424
func testMimimumAndMaximumGivenAListContainingAnEvenNumberOfElements() {
2525
let array = [ 3, 4, 6, 8 ]
2626

27-
let result = minimumMaximum(array)
27+
let result = minimumMaximum(array)!
2828

2929
XCTAssertEqual(result.minimum, 3)
3030
XCTAssertEqual(result.maximum, 8)
@@ -33,7 +33,7 @@ class SelectMinimumMaximumTests: XCTestCase {
3333
func testMimimumAndMaximumGivenAListContainingAnOddNumberOfElements() {
3434
let array = [ 8, 3, 9, 4, 6 ]
3535

36-
let result = minimumMaximum(array)
36+
let result = minimumMaximum(array)!
3737

3838
XCTAssertEqual(result.minimum, 3)
3939
XCTAssertEqual(result.maximum, 9)
@@ -42,7 +42,7 @@ class SelectMinimumMaximumTests: XCTestCase {
4242
func testMimimumAndMaximumGivenAListOfOrderedElements() {
4343
let array = [ 3, 4, 6, 8, 9 ]
4444

45-
let result = minimumMaximum(array)
45+
let result = minimumMaximum(array)!
4646

4747
XCTAssertEqual(result.minimum, 3)
4848
XCTAssertEqual(result.maximum, 9)
@@ -51,18 +51,26 @@ class SelectMinimumMaximumTests: XCTestCase {
5151
func testMimimumAndMaximumGivenAListOfReverseOrderedElements() {
5252
let array = [ 9, 8, 6, 4, 3 ]
5353

54-
let result = minimumMaximum(array)
54+
let result = minimumMaximum(array)!
5555

5656
XCTAssertEqual(result.minimum, 3)
5757
XCTAssertEqual(result.maximum, 9)
5858
}
5959

60+
func testMinimumAndMaximumGivenAnEmptyList() {
61+
let array = [Int]()
62+
63+
let result = minimumMaximum(array)
64+
65+
XCTAssertNil(result)
66+
}
67+
6068
func testMinimumAndMaximumMatchSwiftLibraryGivenARandomList() {
6169
for _ in 0...10 {
6270
for n in 1...100 {
6371
let array = createRandomList(n)
6472

65-
let result = minimumMaximum(array)
73+
let result = minimumMaximum(array)!
6674

6775
XCTAssertEqual(result.minimum, array.minElement())
6876
XCTAssertEqual(result.maximum, array.maxElement())

Select Minimum Maximum/SelectMinimumMaximum.playground/Contents.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
// Compare each item to find minimum
22
func minimum<T: Comparable>(var array: [T]) -> T? {
3+
guard !array.isEmpty else {
4+
return nil
5+
}
6+
37
var minimum = array.removeFirst()
48
for element in array {
59
minimum = element < minimum ? element : minimum
@@ -9,6 +13,10 @@ func minimum<T: Comparable>(var array: [T]) -> T? {
913

1014
// Compare each item to find maximum
1115
func maximum<T: Comparable>(var array: [T]) -> T? {
16+
guard !array.isEmpty else {
17+
return nil
18+
}
19+
1220
var maximum = array.removeFirst()
1321
for element in array {
1422
maximum = element > maximum ? element : maximum
@@ -17,8 +25,12 @@ func maximum<T: Comparable>(var array: [T]) -> T? {
1725
}
1826

1927
// Compare in pairs to find minimum and maximum
20-
func minimumMaximum<T: Comparable>(var array: [T]) -> (minimum: T, maximum: T)
28+
func minimumMaximum<T: Comparable>(var array: [T]) -> (minimum: T, maximum: T)?
2129
{
30+
guard !array.isEmpty else {
31+
return nil
32+
}
33+
2234
var minimum = array.first!
2335
var maximum = array.first!
2436

@@ -56,7 +68,7 @@ minimum(array)
5668
maximum(array)
5769

5870
// Test of minimumMaximum function
59-
let result = minimumMaximum(array)
71+
let result = minimumMaximum(array)!
6072
result.minimum
6173
result.maximum
6274

0 commit comments

Comments
 (0)