Найдите первые, которые имеют наиболее четкую цифру по лямбда-выражению

#java #lambda

#java #лямбда

Вопрос:

В настоящее время я изучаю функцию distinct(), используя в том же лямбда-выражении: первая используется для нахождения отдельной цифры целого числа

 Integer intVar = 12341234;
long c1 = intVar.toString().chars().distinct().count(); // (1,2,3,4)
System.out.println(c1);//result = 4  
  

Затем я хочу попробовать найти то же самое в пределах диапазона,
Моя мысль:

 1.loop from 1 to 1_000_000
2.filter isSquareNumber amp;amp; <= 9_999_999 amp;amp; 1_000_000
3.convert to char
4.distinct
5.store as list(key,value)
6.findfirst key with value=7
  

Потому что исходный код работает, но выглядит ужасно

 int inte = IntStream.iterate(1, i-> i   1)
        .filter(i->isSquareNumber(i) amp;amp; i<= 9999999 amp;amp; i>=1000000)
        .filter(i-> i%10!=i/10%10 amp;amp; i%10!=i/100%10 amp;amp; i%10!=i/1000%10 amp;amp; i%10!=i/10000%10 amp;amp; i%10!=i/100000%10 amp;amp; i%10!=i/1000000%10)
        .filter(i-> i/10%10!=i/100%10 amp;amp; i/10%10!=i/1000%10 amp;amp; i/10%10!=i/10000%10 amp;amp; i/10%10!=i/100000%10 amp;amp; i/10%10!=i/1000000%10)
        .filter(i-> i/100%10!=i/1000%10 amp;amp; i/100%10!=i/10000%10 amp;amp; i/100%10!=i/100000%10 amp;amp; i/100%10!=i/1000000%10)
        .filter(i-> i/1000%10!=i/10000%10 amp;amp; i/1000%10!=i/100000%10 amp;amp; i/1000%10!=i/1000000%10)
        .filter(i-> i/10000%10!=i/10%10 amp;amp; i/10000%10!=i/100000%10)
        .filter(i-> i/100000%10!=i/1000000%10)
        .findFirst()
        .getAsInt();
System.out.println(inte);//result = 1034289
  

WJS помог версии

 IntStream
        .iterate(1, i-> i   1)
        .filter(i->isSquareNumber(i) amp;amp; i<= 9999999 amp;amp; i>=1000000)
        .mapToObj(i->new String[] {Integer.toString(i), Arrays
                .stream(Integer.toString(i).split(""))
                .filter(a -> a[1].length() >= 7)
                .findFirst()
                .ifPresent(a -> System.out
                .println(a[1]   " --> "   a[1].length()));
  

Это работает чудесно. И теперь я пытаюсь сделать еще один шаг, который создает метод, в котором возвращаемый тип является целым числом и возвращает наиболее различимое целое число, но не логическое значение.

Комментарии:

1. Что вы подразумеваете под «найти то же самое в пределах диапазона»? Можете ли вы привести несколько примеров ввода и вывода, как вы делали с одним целым числом?

2. @Sweeper ввод: 1 вывод: 1 ввод: 12 вывод: 2 ввод: 121 вывод: 2 // 1 появляется дважды, 2 появляется один раз и так далее

3. @Sweeper о, это означает, что я хочу сделать то же самое для всех целых чисел от 1 до 1000000 и т. Д

4. Вы хотите найти первые числа размером менее 10 М, которые являются квадратом и состоят из семи разных цифр?

5. @Bohemian Да, он используется для поиска 7 различных цифр или даже больше, он может сначала определить, сколько разных цифр, а затем сохранить в виде массива или переменной для дальнейшего использования.

Ответ №1:

Попробуйте это. Я ограничил его первыми 10 значениями.

  • mapToObj создает массив строк.
  • первый элемент — это исходное значение.
  • следующий разделяет строку, устраняет дубликаты и присоединяется к новой строке
 IntStream.range(100000, 1000000).limit(10)
        .mapToObj(i->new String[] {Integer.toString(i), Arrays
                .stream(Integer.toString(i).split(""))
                .distinct().collect(Collectors.joining(""))})
        .forEach(a->System.out.println(a[0]   " --> "   a[1]));
  

С принтами

 100000 --> 10
100001 --> 10
100002 --> 102
100003 --> 103
100004 --> 104
100005 --> 105
100006 --> 106
100007 --> 107
100008 --> 108
100009 --> 109
  

Найдите первое число, состоящее из 7 различных цифр.

После создания массивов в предыдущем примере замените forEach на filter , за которым следует findFirst , а затем выведите значение, если оно присутствует.

 IntStream.range(1000000, 10000000)
        .mapToObj(i -> new String[] { Integer.toString(i),
                Arrays.stream(Integer.toString(i).split(""))
                        .distinct()
                        .collect(Collectors.joining("")) })
        .filter(a -> a[1].length() >= 7).findFirst()
        .ifPresent(a -> System.out
                .println(a[1]   " --> "   a[1].length()));
  

С принтами

 1023456 --> 7
  

Комментарии:

1. часть mapToObj выполняет работу, подобную списку (ключ, значение)?, тогда что, если я хочу .count() часть значения, чтобы получить вхождение уникального числа likes [ввод: 12344321 , вывод: 12344321 -> 4]

2. о, кстати, спасибо, что научили меня новому способу использования stream с в потоке, это повышает гибкость

3. Добро пожаловать. Я предполагаю, что под 4 в вашем предыдущем вопросе вы подразумеваете количество различных цифр.

4. да, я хочу найти отдельные цифры целого числа и найти первое число, которое должно содержать 1,2,3, … 7 различных цифр и так далее

5. о, ваш код напоминает мне, что я забыл, что ваш a[1] снова собирается как строка и может быть отфильтрован после .map(). я действительно новичок в многоуровневом потоке и массиве

Ответ №2:

Чтобы найти все числа, которые являются квадратами, которые имеют не менее 7 различных цифр:

 int[] all = IntStream.range(1000, (int) Math.sqrt(10_000_000))
    .map(i -> i * i)
    .filter(i -> Integer.toString(i).chars().distinct().count() > 6)
    .toArray();
  

Чтобы найти только первую (или взорваться, но их 123):

 int first = IntStream.range(1000, (int) Math.sqrt(10_000_000))
    .map(i -> i * i)
    .filter(i -> Integer.toString(i).chars().distinct().count() > 6)
    .findFirst()
    .orElseThrow(RuntimeException::new);
  

Вместо того, чтобы перебирать каждое число, я повторяю квадратный корень, а затем возводю его в квадрат, так что это намного эффективнее.

Комментарии:

1. о, чувак, ты отлично решил мой вопрос, большое тебе спасибо