import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.IntStream;
class MedianFilter {
public static <T extends Comparable<T>> T[] getMedians(T[] data, int shoulder) {
T
[] result
= Arrays.
copyOf(data, data.
length); IntStream.range(shoulder, data.length - shoulder).parallel().forEach(i -> result[i] = medianPoint(data, i, shoulder));
return result;
}
private static <T extends Comparable<T>> T medianPoint(T[] data, int index, int shoulder) {
T
[] window
= Arrays.
copyOfRange(data, index
- shoulder, index
+ shoulder
+ 1); if (window.length != (shoulder * 2 + 1)) {
}
return window[shoulder];
}
Integer[] data
= rand.
ints(10,
0,
20).
boxed().
toArray(s
-> new Integer[s
]); Future
<Integer[]> fut
= medians
(data,
4); }
public static <T extends Comparable<T>> Future<T[]> medians(T[] data, int shoulder) {
ExecutorService service = Executors.newSingleThreadExecutor(r -> {
t.setDaemon(true);
return t;
});
Future<T[]> fut = service.submit(() -> getMedians(data, shoulder));
service.shutdown();
return fut;
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CgpjbGFzcyBNZWRpYW5GaWx0ZXIgewogICAgCiAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gVFtdIGdldE1lZGlhbnMoVFtdIGRhdGEsIGludCBzaG91bGRlcikgewogICAgICAgIFRbXSByZXN1bHQgPSBBcnJheXMuY29weU9mKGRhdGEsIGRhdGEubGVuZ3RoKTsKICAgICAgICBJbnRTdHJlYW0ucmFuZ2Uoc2hvdWxkZXIsIGRhdGEubGVuZ3RoIC0gc2hvdWxkZXIpLnBhcmFsbGVsKCkuZm9yRWFjaChpIC0+IHJlc3VsdFtpXSA9IG1lZGlhblBvaW50KGRhdGEsIGksIHNob3VsZGVyKSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBUIG1lZGlhblBvaW50KFRbXSBkYXRhLCBpbnQgaW5kZXgsIGludCBzaG91bGRlcikgewogICAgICAgIFRbXSB3aW5kb3cgPSBBcnJheXMuY29weU9mUmFuZ2UoZGF0YSwgaW5kZXggLSBzaG91bGRlciwgaW5kZXggKyBzaG91bGRlciArIDEpOwogICAgICAgIGlmICh3aW5kb3cubGVuZ3RoICE9IChzaG91bGRlciAqIDIgKyAxKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbGxlZ2FsIHdpbmRvdyBzaXplICIgKyB3aW5kb3cubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgQXJyYXlzLnNvcnQod2luZG93KTsKICAgICAgICByZXR1cm4gd2luZG93W3Nob3VsZGVyXTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKDEwMCk7CiAgICAgICAgSW50ZWdlcltdIGRhdGEgPSByYW5kLmludHMoMTAsIDAsIDIwKS5ib3hlZCgpLnRvQXJyYXkocyAtPiBuZXcgSW50ZWdlcltzXSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy50b1N0cmluZyhkYXRhKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy50b1N0cmluZyhnZXRNZWRpYW5zKGRhdGEsIDQpKSk7CiAgICAgICAgRnV0dXJlPEludGVnZXJbXT4gZnV0ID0gbWVkaWFucyhkYXRhLCA0KTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLnRvU3RyaW5nKGZ1dC5nZXQoKSkpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBGdXR1cmU8VFtdPiBtZWRpYW5zKFRbXSBkYXRhLCBpbnQgc2hvdWxkZXIpIHsKICAgICAgICBFeGVjdXRvclNlcnZpY2Ugc2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcihyIC0+IHsKICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHIpOwogICAgICAgICAgICB0LnNldERhZW1vbih0cnVlKTsKICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgRnV0dXJlPFRbXT4gZnV0ID0gIHNlcnZpY2Uuc3VibWl0KCgpIC0+IGdldE1lZGlhbnMoZGF0YSwgc2hvdWxkZXIpKTsKICAgICAgICBzZXJ2aWNlLnNodXRkb3duKCk7CiAgICAgICAgcmV0dXJuIGZ1dDsKICAgIH0KICAgIAp9
[15, 10, 14, 8, 11, 6, 16, 8, 3, 13]
[15, 10, 14, 8, 10, 10, 16, 8, 3, 13]
[15, 10, 14, 8, 10, 10, 16, 8, 3, 13]