Как узнать, какие цифры отсутствуют в IntStream - PullRequest
0 голосов
/ 21 января 2020

Я хочу вернуть строку, состоящую из тех цифр (в порядке возрастания), которые не появляются ни в одном из номеров аргументов. Я не знаю, как это сделать, но я хотел бы использовать long в качестве компаратора, чтобы найти недостающие цифры в IntStream.

Например, если цифр = [ 1201, 23045], я должен вернуть "6789"

Мой код:

public static String digitosQueNoEstanEn(List<Long> numeros)
{
    long n = 1234567890;
    IntStream numStream = numeros.stream()
        .map(c -> c.toString())
        .flatMapToInt(c -> c.chars())
        .distinct();

Ответы [ 2 ]

5 голосов
/ 21 января 2020

Существует много решений этой проблемы, одним из которых является простое удаление набора. По сути, вы хотите удалить все использованные цифры из набора допустимых цифр и сохранить результат как 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());
}
0 голосов
/ 21 января 2020

Вот то, что я придумал.

        public static String digitosQueNoEstanEn(List<Long> numeros) {
           String digits = "0123456789";
           return numeros.stream()
                .flatMap(numero->Arrays.stream(Long.toString(numero).split("")))
                .distinct()
                .reduce(digits, (dgts,d)->dgts.contains(d) ? dgts.replace(d,"") : dgts);
         }

         List<Long> numeros = List.of(1201L, 23045L);
         digitosQueNoEstanEn(numeros);  
         System.out.println(result);

6789

По сути, я сглаживаю список предоставленных номеров до цифр, а затем просто удаляю их в восстановительная операция. То, что осталось, это цифры, которых не было в исходных номерах.

...