import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Consumer;
import java.util.stream.IntStream;
class Ideone
{
{
System.
out.
println("shuffle, all permutations seen after: " + permutations
(Collections::shuffle
) + " avg"); System.
out.
println("sort, all permutations seen after: " + permutations
(list
-> list.
sort(randomOrder
())) + " avg"); }
private static double permutations(Consumer<List<String>> shuffle) {
final int expectedPermutations = 6;
return IntStream.generate(() -> {
int steps;
HashSet<List<?>> seen = new HashSet<>();
for(steps = 0; seen.size() < expectedPermutations; steps++) {
List
<String
> l
= Arrays.
asList("a",
"b",
"c"); shuffle.accept(l);
seen.add(l);
}
return steps;
}).limit(1000).average().orElse(0);
}
public static Comparator<String> randomOrder() {
ThreadLocalRandom r = ThreadLocalRandom.current();
int x = r.nextInt(), y = r.nextInt(), z = r.nextInt();
boolean b = r.nextBoolean();
.thenComparingInt(s -> s.length()^z)
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKCmNsYXNzIElkZW9uZQp7CiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCiAgewogICAgU3lzdGVtLm91dC5wcmludGxuKCJzaHVmZmxlLCBhbGwgcGVybXV0YXRpb25zIHNlZW4gYWZ0ZXI6ICIgKyBwZXJtdXRhdGlvbnMoQ29sbGVjdGlvbnM6OnNodWZmbGUpICsgIiBhdmciKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigic29ydCwgYWxsIHBlcm11dGF0aW9ucyBzZWVuIGFmdGVyOiAiICsgcGVybXV0YXRpb25zKGxpc3QgLT4gbGlzdC5zb3J0KHJhbmRvbU9yZGVyKCkpKSArICIgYXZnIik7CiAgfQogCiAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIHBlcm11dGF0aW9ucyhDb25zdW1lcjxMaXN0PFN0cmluZz4+IHNodWZmbGUpIHsKICAgIGZpbmFsIGludCBleHBlY3RlZFBlcm11dGF0aW9ucyA9IDY7CiAgICByZXR1cm4gSW50U3RyZWFtLmdlbmVyYXRlKCgpIC0+IHsKICAgICAgaW50IHN0ZXBzOwogICAgICBIYXNoU2V0PExpc3Q8Pz4+IHNlZW4gPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgIGZvcihzdGVwcyA9IDA7IHNlZW4uc2l6ZSgpIDwgZXhwZWN0ZWRQZXJtdXRhdGlvbnM7IHN0ZXBzKyspIHsKICAgICAgICBMaXN0PFN0cmluZz4gbCA9IEFycmF5cy5hc0xpc3QoImEiLCAiYiIsICJjIik7CiAgICAgICAgc2h1ZmZsZS5hY2NlcHQobCk7CiAgICAgICAgc2Vlbi5hZGQobCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfSkubGltaXQoMTAwMCkuYXZlcmFnZSgpLm9yRWxzZSgwKTsKICB9CgogIHB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvcjxTdHJpbmc+IHJhbmRvbU9yZGVyKCkgewogICAgICBUaHJlYWRMb2NhbFJhbmRvbSByID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpOwogICAgICBpbnQgeCA9IHIubmV4dEludCgpLCB5ID0gci5uZXh0SW50KCksIHogPSByLm5leHRJbnQoKTsKICAgICAgYm9vbGVhbiBiID0gci5uZXh0Qm9vbGVhbigpOwogICAgICByZXR1cm4gQ29tcGFyYXRvci5jb21wYXJpbmdJbnQoKFN0cmluZyBzKSAtPiBJbnRlZ2VyLnJldmVyc2UoKHMuaGFzaENvZGUoKSZ4KV55KSkKICAgICAgIC50aGVuQ29tcGFyaW5nSW50KHMgLT4gcy5sZW5ndGgoKV56KQogICAgICAgLnRoZW5Db21wYXJpbmcoYj8gQ29tcGFyYXRvci5uYXR1cmFsT3JkZXIoKTogQ29tcGFyYXRvci5yZXZlcnNlT3JkZXIoKSk7CiAgfQp9