/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
interface AverageMaker<T extends Number> {
T initialResult();
T divideByCount(T a, int b);
}
public static <T
extends Number, R
extends Number
> R averageValue
(Iterable
<T
> items, AverageMaker
<R
> maker
) { R res = maker.initialResult();
int count = 0;
for (T val : items) {
res = maker.add(res, val);
count++;
}
return maker.divideByCount(res, count);
}
static final AverageMaker<Double> doubleAvg = new AverageMaker<Double>() {
public Double initialResult
() { return 0.0; } public Double divideByCount
(Double a,
int b
) { return a
/b
; } };
static final AverageMaker<Integer> intAvg = new AverageMaker<Integer>() {
public Integer initialResult
() { return 0; } };
{
List<Integer> a = new ArrayList<Integer>();
a.add(4);
a.add(8);
a.add(91);
a.add(18);
double avgDouble = averageValue(a, doubleAvg);
int avgInt = averageValue(a, intAvg);
System.
out.
println(avgDouble
); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCQoJCglpbnRlcmZhY2UgQXZlcmFnZU1ha2VyPFQgZXh0ZW5kcyBOdW1iZXI+IHsKICAgIFQgaW5pdGlhbFJlc3VsdCgpOwogICAgVCBhZGQoVCBhLCBOdW1iZXIgYik7CiAgICBUIGRpdmlkZUJ5Q291bnQoVCBhLCBpbnQgYik7Cn0KCnB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBOdW1iZXIsIFIgZXh0ZW5kcyBOdW1iZXI+IFIgYXZlcmFnZVZhbHVlKEl0ZXJhYmxlPFQ+IGl0ZW1zLCBBdmVyYWdlTWFrZXI8Uj4gbWFrZXIpIHsKICAgIFIgcmVzID0gbWFrZXIuaW5pdGlhbFJlc3VsdCgpOwogICAgaW50IGNvdW50ID0gMDsKICAgIGZvciAoVCB2YWwgOiBpdGVtcykgewogICAgICAgIHJlcyA9IG1ha2VyLmFkZChyZXMsIHZhbCk7CiAgICAgICAgY291bnQrKzsKICAgIH0KICAgIHJldHVybiBtYWtlci5kaXZpZGVCeUNvdW50KHJlcywgY291bnQpOwp9CgkKCXN0YXRpYyBmaW5hbCBBdmVyYWdlTWFrZXI8RG91YmxlPiBkb3VibGVBdmcgPSBuZXcgQXZlcmFnZU1ha2VyPERvdWJsZT4oKSB7CiAgICAJcHVibGljIERvdWJsZSBpbml0aWFsUmVzdWx0KCkgeyByZXR1cm4gMC4wOyB9CiAgICAgICAgcHVibGljIERvdWJsZSBhZGQoRG91YmxlIGEsIE51bWJlciBiKSB7IHJldHVybiBhICsgYi5kb3VibGVWYWx1ZSgpOyB9CiAgICAgICAgcHVibGljIERvdWJsZSBkaXZpZGVCeUNvdW50KERvdWJsZSBhLCBpbnQgYikgeyByZXR1cm4gYS9iOyB9CiAgICB9OwoJc3RhdGljIGZpbmFsIEF2ZXJhZ2VNYWtlcjxJbnRlZ2VyPiBpbnRBdmcgPSBuZXcgQXZlcmFnZU1ha2VyPEludGVnZXI+KCkgewogICAgCXB1YmxpYyBJbnRlZ2VyIGluaXRpYWxSZXN1bHQoKSB7IHJldHVybiAwOyB9CiAgICAgICAgcHVibGljIEludGVnZXIgYWRkKEludGVnZXIgYSwgTnVtYmVyIGIpIHsgcmV0dXJuIGEgKyBiLmludFZhbHVlKCk7IH0KICAgICAgICBwdWJsaWMgSW50ZWdlciBkaXZpZGVCeUNvdW50KEludGVnZXIgYSwgaW50IGIpIHsgcmV0dXJuIGEvYjsgfQogICAgfTsKCQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJTGlzdDxJbnRlZ2VyPiBhID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwoJCWEuYWRkKDQpOwoJCWEuYWRkKDgpOwoJCWEuYWRkKDkxKTsKICAgICAgICBhLmFkZCgxOCk7CiAgICAgICAgZG91YmxlIGF2Z0RvdWJsZSA9IGF2ZXJhZ2VWYWx1ZShhLCBkb3VibGVBdmcpOwogICAgICAgIGludCBhdmdJbnQgPSBhdmVyYWdlVmFsdWUoYSwgaW50QXZnKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYXZnRG91YmxlKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYXZnSW50KTsKCX0KfQ==