/* package whatever; // don't place package name! */
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import java.util.Random;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Stream.generate;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static class MaxAndMinDto {
private final List<Integer> max;
private final List<Integer> min;
private MaxAndMinDto(List<Integer> max, List<Integer> min) {
this.max = max;
this.min = min;
}
public List<Integer> getMax() {
return max;
}
public List<Integer> getMin() {
return min;
}
@Override
return "MaxAndMinDto{max=" + max + ", min=" + min + '}';
}
}
public static Function<Stream<Integer>, MaxAndMinDto> findMaxAndMinWithLimit(int limit) {
Comparator
<Integer
> comparator
= Integer::compareTo
; return s -> s
.map(list -> new MaxAndMinDto(list, list))
.reduce((left, right) -> new MaxAndMinDto(
Stream.concat(left.getMax().stream(), right.getMax().stream())
.sorted(comparator.reversed())
.distinct()
.limit(limit)
.collect(toList()),
Stream.concat(left.getMin().stream(), right.getMin().stream())
.sorted(comparator)
.distinct()
.limit(limit)
.collect(toList())
))
.orElseGet(() -> new MaxAndMinDto(emptyList(), emptyList()));
}
{
int limit = 5;
Stream<Integer> values = generate(random::nextInt).limit(5000000);
MaxAndMinDto maxAndMinDto = findMaxAndMinWithLimit(limit).apply(values);
System.
out.
println(maxAndMinDto
); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKaW1wb3J0IGphdmEudXRpbC5SYW5kb207CgppbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3Q7CmltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5nZW5lcmF0ZTsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUKewogICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXhBbmRNaW5EdG8gewogICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbnRlZ2VyPiBtYXg7CiAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEludGVnZXI+IG1pbjsKICAgICAgICAKICAgICAgICBwcml2YXRlIE1heEFuZE1pbkR0byhMaXN0PEludGVnZXI+IG1heCwgTGlzdDxJbnRlZ2VyPiBtaW4pIHsKICAgICAgICAJdGhpcy5tYXggPSBtYXg7CiAgICAgICAgCXRoaXMubWluID0gbWluOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRNYXgoKSB7CiAgICAgICAgCXJldHVybiBtYXg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IGdldE1pbigpIHsKICAgICAgICAJcmV0dXJuIG1pbjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXhBbmRNaW5EdG97bWF4PSIgKyBtYXggKyAiLCBtaW49IiArIG1pbiArICd9JzsKICAgICAgICB9CiAgICB9CgkgICAgCglwdWJsaWMgc3RhdGljIEZ1bmN0aW9uPFN0cmVhbTxJbnRlZ2VyPiwgTWF4QW5kTWluRHRvPiBmaW5kTWF4QW5kTWluV2l0aExpbWl0KGludCBsaW1pdCkgewogICAgICAgIENvbXBhcmF0b3I8SW50ZWdlcj4gY29tcGFyYXRvciA9IEludGVnZXI6OmNvbXBhcmVUbzsKICAgICAgICByZXR1cm4gcyAtPiBzCiAgICAgICAgICAgICAgICAubWFwKENvbGxlY3Rpb25zOjpzaW5nbGV0b25MaXN0KQogICAgICAgICAgICAgICAgLm1hcChsaXN0IC0+IG5ldyBNYXhBbmRNaW5EdG8obGlzdCwgbGlzdCkpCiAgICAgICAgICAgICAgICAucmVkdWNlKChsZWZ0LCByaWdodCkgLT4gbmV3IE1heEFuZE1pbkR0bygKICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtLmNvbmNhdChsZWZ0LmdldE1heCgpLnN0cmVhbSgpLCByaWdodC5nZXRNYXgoKS5zdHJlYW0oKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydGVkKGNvbXBhcmF0b3IucmV2ZXJzZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlzdGluY3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5saW1pdChsaW1pdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdCh0b0xpc3QoKSksCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbS5jb25jYXQobGVmdC5nZXRNaW4oKS5zdHJlYW0oKSwgcmlnaHQuZ2V0TWluKCkuc3RyZWFtKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnRlZChjb21wYXJhdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXN0aW5jdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpbWl0KGxpbWl0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KHRvTGlzdCgpKQogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgIC5vckVsc2VHZXQoKCkgLT4gbmV3IE1heEFuZE1pbkR0byhlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpKTsKICAgIH0KCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCSAgICAgICAgaW50IGxpbWl0ID0gNTsKCSAgICAgICAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKICAgICAgICAgICAgICAgICAgICBTdHJlYW08SW50ZWdlcj4gdmFsdWVzID0gZ2VuZXJhdGUocmFuZG9tOjpuZXh0SW50KS5saW1pdCg1MDAwMDAwKTsKCSAgICAgICAgTWF4QW5kTWluRHRvIG1heEFuZE1pbkR0byA9IGZpbmRNYXhBbmRNaW5XaXRoTGltaXQobGltaXQpLmFwcGx5KHZhbHVlcyk7CgkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtYXhBbmRNaW5EdG8pOwoJfQp9
MaxAndMinDto{max=[2147482948, 2147482144, 2147480305, 2147479108, 2147477375], min=[-2147481687, -2147479985, -2147479343, -2147479227, -2147477344]}