Существует много решений этой проблемы, одним из которых является простое удаление набора. По сути, вы хотите удалить все использованные цифры из набора допустимых цифр и сохранить результат как String
. Это можно сделать с помощью следующего:
public static String digitosQueNoEstanEn(List<Long> numeros) {
Set<Integer> usedDigits = numeros.stream()
.map(String::valueOf)
.flatMapToInt(String::chars)
.map(c -> Character.digit(c, 10))
.boxed()
.collect(Collectors.toSet());
return IntStream.range(0, 10)
.filter(i -> !usedDigits.contains(i))
.sorted()
.mapToObj(Integer::toString)
.collect(Collectors.joining());
}
Когда вы вызываете с вашим примером [1201L, 23045L]
, вы получите то, что ожидаете:
6789
Энди Тернер также упомянул что с использованием BitSet
может быть жизнеспособным решением. Если вы решите использовать один, ваше решение может выглядеть следующим образом:
public static String digitosQueNoEstanEn(List<Long> numeros) {
BitSet bitSet = BitSet.valueOf(new long[] { 0b0011_1111_1111 });
numeros.stream()
.map(String::valueOf)
.flatMapToInt(String::chars)
.map(c -> Character.digit(c, 10))
.forEach(bitSet::clear);
return bitSet.stream()
.sorted()
.mapToObj(Integer::toString)
.collect(Collectors.joining());
}