Averages/Median: Difference between revisions

m (→‎{{header|Phix}}: added syntax colouring, marked p2js compatible)
Line 2,092:
return (pq.poll() + pq.poll()) / 2.0;
}</lang>
 
{{works with|Java|1.8+}}
Written in the style of Java commonly found in real life, where annotations, tests, and abstractions get most of the real estate. The JavaDoc has been elided, or it'd be twice again as long. Java is verbose.
 
<lang java8>
public class AveragesMedian {
 
@FunctionalInterface
public interface MedianOfObjects<T, R> extends Function<Collection<T>, R> {
 
@Override
R apply(Collection<T> data);
}
 
protected abstract static class AbstractMedianOfObjectsImpl<T, R> implements MedianOfObjects<T, R> {
 
@SuppressWarnings("OptionalGetWithoutIsPresent")
protected final R apply(Collection<T> data,
Supplier<R> ifEmpty,
Function<T, R> ifOdd,
Function<List<T>, R> ifEven) {
 
return Objects.requireNonNull(data, "data must not be null").isEmpty()
? ifEmpty.get()
: (data.size() & 1) == 0
? ifEven.apply(data.stream().sorted().skip(data.size() / 2 - 1).limit(2).toList())
: ifOdd.apply(data.stream().sorted().skip(data.size() / 2).limit(1).findFirst().get());
}
}
 
public static class MedianOfFloats
extends AbstractMedianOfObjectsImpl<Float, Float> {
 
private MedianOfFloats() {}
 
public static MedianOfFloats getInstance() {
return Holder.INSTANCE;
}
 
private static class Holder {
private static final MedianOfFloats INSTANCE = new MedianOfFloats();
}
 
@Override
public Float apply(Collection<Float> data) {
return apply(data, () -> 0f, n -> n, pair -> (pair.get(0) + pair.get(1)) / 2);
}
}
 
private static class MedianOfFloatsTest {
 
@Test
void getInstance() {
assertAll(() -> assertEquals(MedianOfFloats.getInstance(), MedianOfFloats.getInstance()),
() -> assertNotNull(MedianOfFloats.getInstance()));
}
 
@Test
@SuppressWarnings("DuplicatedCode")
void apply() {
final MedianOfFloats instance = MedianOfFloats.getInstance();
 
assertThrows(NullPointerException.class, () -> instance.apply(null));
 
for (float a = -5f; a <= 5f; a += 0.4f) {
assertEquals(a, instance.apply(List.of(a)));
 
for (float b = -5; b <= 5; b += 0.4f) {
assertEquals((a + b) / 2f, instance.apply(List.of(a, b)));
 
for (float c = -5; c <=5; c += 0.4f) {
final List<Float> listOf3 = List.of(a, b, c);
final float medianOf3 = listOf3.stream().sorted().toList().get(1);
assertEquals(medianOf3, instance.apply(listOf3));
 
for (float d = -5; d <=5; d += 0.4f) {
final List<Float> listOf4 = List.of(a, b, c, d);
final List<Float> sortedListOf4 = listOf4.stream().sorted().toList();
final float medianOf4 = (sortedListOf4.get(1) + sortedListOf4.get(2)) / 2;
assertEquals(medianOf4, instance.apply(listOf4));
 
for (float e = -5; e <= 5; e += 0.4f) {
final List<Float> listOf5 = List.of(a, b, c, d, e);
final float medianOf5 = listOf5.stream().sorted().toList().get(2);
assertEquals(medianOf5, instance.apply(listOf5));
}
}
}
}
}
}
}
}
</lang>
 
=={{header|JavaScript}}==
Anonymous user