/* package whatever; // don't place package name! */
import java.io.*;
import java.lang.*;
import java.util.*;
import java.util.Comparator;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.stream.*;
class Car {
int num;
public Car
(int num,
String engine
) { this.num = num;
this.engine = engine;
}
return this.num;
}
return this.engine;
}
return String.
format("Car: %d, %s", num, engine
); }
}
/* Name of the class has to be "Main" only if the class is public. */
class Ideone {
public static <T> Predicate<T> distinctByKey(
Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
public static Comparator<Car> withNullEnginesLast() {
.thenComparing(
}
// your code goes here
// num, engine
new Car(1, "S02K"), new Car(1, null), new Car(2, null),
new Car(2, "S9K"), new Car(3, null));
var result =
carList.stream()
.sorted(withNullEnginesLast()) // sort first by num, then engine
// where null-engines last
.filter(distinctByKey(Car::getNum))
.collect(Collectors.toList());
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEubGFuZy4qOwppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uKjsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uKjsKCmNsYXNzIENhciB7CiAgaW50IG51bTsKICBTdHJpbmcgZW5naW5lOwoKICBwdWJsaWMgQ2FyKGludCBudW0sIFN0cmluZyBlbmdpbmUpIHsKICAgIHRoaXMubnVtID0gbnVtOwogICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7CiAgfQoKICBwdWJsaWMgSW50ZWdlciBnZXROdW0oKSB7CiAgICByZXR1cm4gdGhpcy5udW07CiAgfQoKICBwdWJsaWMgU3RyaW5nIGdldEVuZ2luZSgpIHsKICAgIHJldHVybiB0aGlzLmVuZ2luZTsKICB9CgogIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQ2FyOiAlZCwgJXMiLCBudW0sIGVuZ2luZSk7CiAgfQp9CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lIHsKICBwdWJsaWMgc3RhdGljIDxUPiBQcmVkaWNhdGU8VD4gZGlzdGluY3RCeUtleSgKICAgICAgRnVuY3Rpb248PyBzdXBlciBULCA/PiBrZXlFeHRyYWN0b3IpIHsKICAgIFNldDxPYmplY3Q+IHNlZW4gPSBDb25jdXJyZW50SGFzaE1hcC5uZXdLZXlTZXQoKTsKICAgIHJldHVybiB0IC0+IHNlZW4uYWRkKGtleUV4dHJhY3Rvci5hcHBseSh0KSk7CiAgfQoKICBwdWJsaWMgc3RhdGljIENvbXBhcmF0b3I8Q2FyPiB3aXRoTnVsbEVuZ2luZXNMYXN0KCkgewogICAgcmV0dXJuIENvbXBhcmF0b3IuY29tcGFyaW5nKENhcjo6Z2V0TnVtKQogICAgICAgIC50aGVuQ29tcGFyaW5nKAogICAgICAgICAgICBDYXI6OmdldEVuZ2luZSwgQ29tcGFyYXRvci5udWxsc0xhc3QoQ29tcGFyYXRvci5uYXR1cmFsT3JkZXIoKSkpOwogIH0KCiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewogICAgLy8geW91ciBjb2RlIGdvZXMgaGVyZQoKICAgIHZhciBjYXJMaXN0ID0gTGlzdC5vZigKICAgICAgICAvLyBudW0sIGVuZ2luZQogICAgICAgIG5ldyBDYXIoMSwgIlMwMksiKSwgbmV3IENhcigxLCBudWxsKSwgbmV3IENhcigyLCBudWxsKSwKICAgICAgICBuZXcgQ2FyKDIsICJTOUsiKSwgbmV3IENhcigzLCBudWxsKSk7CgogICAgdmFyIHJlc3VsdCA9CiAgICAgICAgY2FyTGlzdC5zdHJlYW0oKQogICAgICAgICAgICAuc29ydGVkKHdpdGhOdWxsRW5naW5lc0xhc3QoKSkgLy8gc29ydCBmaXJzdCBieSBudW0sIHRoZW4gZW5naW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSBudWxsLWVuZ2luZXMgbGFzdAogICAgICAgICAgICAuZmlsdGVyKGRpc3RpbmN0QnlLZXkoQ2FyOjpnZXROdW0pKQogICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKCiAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKICB9Cn0=