1
1
use core:: cmp:: { Ord , Ordering , PartialEq } ;
2
- use num:: Num ;
2
+
3
+ use num:: { Float , Num , NumCast } ;
4
+
5
+ use crate :: ext:: cmp;
3
6
4
7
/// Returns the average value of the given data set, or None if data is empty.
5
8
pub fn average < T > ( data : Vec < T > ) -> Option < T >
@@ -22,31 +25,40 @@ where
22
25
/// Returns the median value using the given compare function, or None if data is empty.
23
26
pub fn median_by < T , F > ( mut data : Vec < T > , compare : F ) -> Option < T >
24
27
where
25
- T : Num ,
28
+ T : Num + NumCast ,
26
29
F : FnMut ( & T , & T ) -> Ordering ,
27
30
{
28
31
if data. is_empty ( ) {
29
32
return None ;
30
33
}
34
+
31
35
data. sort_by ( compare) ;
32
36
let mid = data. len ( ) / 2 ;
33
37
if data. len ( ) % 2 == 0 {
34
38
let rhs = data. swap_remove ( mid) ;
35
39
let lhs = data. swap_remove ( mid - 1 ) ;
36
- Some ( ( lhs + rhs) / ( T :: one ( ) + T :: one ( ) ) )
40
+ Some ( ( lhs + rhs) / NumCast :: from ( 2 ) . unwrap ( ) )
37
41
} else {
38
42
Some ( data. swap_remove ( mid) )
39
43
}
40
44
}
41
45
42
46
/// Returns the median value of the given data set, or None if data is empty.
43
- pub fn median < T > ( data : Vec < T > ) -> Option < T >
47
+ pub fn median_integer < T > ( data : Vec < T > ) -> Option < T >
44
48
where
45
- T : Ord + Num ,
49
+ T : Ord + Num + NumCast ,
46
50
{
47
51
median_by ( data, T :: cmp)
48
52
}
49
53
54
+ /// Returns the median value of the given data set, or None if data is empty.
55
+ pub fn median_float < T > ( data : Vec < T > ) -> Option < T >
56
+ where
57
+ T : Float + NumCast ,
58
+ {
59
+ median_by ( data, cmp:: fcmp)
60
+ }
61
+
50
62
/// Returns the majority value of the given data set, or None if there is no majority.
51
63
pub fn majority < T > ( mut data : Vec < T > ) -> Option < T >
52
64
where
87
99
#[ cfg( test) ]
88
100
mod tests {
89
101
use super :: * ;
90
- use crate :: ext:: cmp;
91
102
92
103
#[ test]
93
104
fn test_average_empty ( ) {
@@ -122,51 +133,51 @@ mod tests {
122
133
#[ test]
123
134
fn test_median_odd_int ( ) {
124
135
let vals = vec ! [ 3 , 2 , 5 , 7 , 2 , 9 , 1 ] ;
125
- assert_eq ! ( median ( vals) , Some ( 3 ) ) ;
136
+ assert_eq ! ( median_integer ( vals) , Some ( 3 ) ) ;
126
137
}
127
138
128
139
#[ test]
129
140
fn test_median_single_int ( ) {
130
141
let vals = vec ! [ 3 ] ;
131
- assert_eq ! ( median ( vals) , Some ( 3 ) ) ;
142
+ assert_eq ! ( median_integer ( vals) , Some ( 3 ) ) ;
132
143
}
133
144
134
145
#[ test]
135
146
fn test_median_empty ( ) {
136
147
let vals: Vec < i64 > = vec ! [ ] ;
137
- assert_eq ! ( median ( vals) , None ) ;
148
+ assert_eq ! ( median_integer ( vals) , None ) ;
138
149
}
139
150
140
151
#[ test]
141
152
fn test_median_even_int ( ) {
142
153
let vals = vec ! [ 3 , 2 , 5 , 7 , 2 , 10 , 32 , 1 ] ;
143
- assert_eq ! ( median ( vals) , Some ( 4 ) ) ;
154
+ assert_eq ! ( median_integer ( vals) , Some ( 4 ) ) ;
144
155
let vals = vec ! [ 13 , 36 , 33 , 45 ] ;
145
- assert_eq ! ( median ( vals) , Some ( 34 ) ) ;
156
+ assert_eq ! ( median_integer ( vals) , Some ( 34 ) ) ;
146
157
let vals = vec ! [ 13 , 15 ] ;
147
- assert_eq ! ( median ( vals) , Some ( 14 ) ) ;
158
+ assert_eq ! ( median_integer ( vals) , Some ( 14 ) ) ;
148
159
}
149
160
150
161
#[ test]
151
162
fn test_median_odd_float ( ) {
152
163
let vals = vec ! [ 3.5 , 2.7 , 5.1 , 7.4 , 2.0 , 9.1 , 1.9 ] ;
153
- assert_eq ! ( median_by ( vals, cmp :: fcmp ) , Some ( 3.5 ) ) ;
164
+ assert_eq ! ( median_float ( vals) , Some ( 3.5 ) ) ;
154
165
}
155
166
156
167
#[ test]
157
168
fn test_median_single_float ( ) {
158
169
let vals = vec ! [ 3.0 ] ;
159
- assert_eq ! ( median_by ( vals, cmp :: fcmp ) , Some ( 3.0 ) ) ;
170
+ assert_eq ! ( median_float ( vals) , Some ( 3.0 ) ) ;
160
171
}
161
172
162
173
#[ test]
163
174
fn test_median_even_float ( ) {
164
175
let vals = vec ! [ 3.4 , 2.0 , 5.7 , 7.1 , 2.2 , 10.1 , 32.0 , 1.8 ] ;
165
- assert_eq ! ( median_by ( vals, cmp :: fcmp ) , Some ( 4.55 ) ) ;
176
+ assert_eq ! ( median_float ( vals) , Some ( 4.55 ) ) ;
166
177
let vals = vec ! [ 13.0 , 36.0 , 45.0 , 33.0 ] ;
167
- assert_eq ! ( median_by ( vals, cmp :: fcmp ) , Some ( 34.5 ) ) ;
178
+ assert_eq ! ( median_float ( vals) , Some ( 34.5 ) ) ;
168
179
let vals = vec ! [ 13.0 , 36.2 ] ;
169
- assert_eq ! ( median_by ( vals, cmp :: fcmp ) , Some ( 24.6 ) ) ;
180
+ assert_eq ! ( median_float ( vals) , Some ( 24.6 ) ) ;
170
181
}
171
182
172
183
#[ test]
0 commit comments