Actualmente, estoy aprendiendo la función de distinto() usando la misma expresión lambda: el primero se usa para encontrar el dígito distinto de un número entero
Integer intVar = 12341234; long c1 = intVar.toString().chars().distinct().count(); // (1,2,3,4) System.out.println(c1);//result = 4Entonces quiero intentar encontrar lo mismo dentro de un rango. Mi pensamiento es:
1.loop from 1 to 1_000_000 2.filter isSquareNumber && <= 9_999_999 && 1_000_000 3.convert to char 4.distinct 5.store as list(key,value) 6.findfirst key with value=7Porque el código original funciona pero se ve horrible
int inte = IntStream.iterate(1, i-> i + 1) .filter(i->isSquareNumber(i) && i<= 9999999 && i>=1000000) .filter(i-> i%10!=i/10%10 && i%10!=i/100%10 && i%10!=i/1000%10 && i%10!=i/10000%10 && i%10!=i/100000%10 && i%10!=i/1000000%10) .filter(i-> i/10%10!=i/100%10 && i/10%10!=i/1000%10 && i/10%10!=i/10000%10 && i/10%10!=i/100000%10 && i/10%10!=i/1000000%10) .filter(i-> i/100%10!=i/1000%10 && i/100%10!=i/10000%10 && i/100%10!=i/100000%10 && i/100%10!=i/1000000%10) .filter(i-> i/1000%10!=i/10000%10 && i/1000%10!=i/100000%10 && i/1000%10!=i/1000000%10) .filter(i-> i/10000%10!=i/10%10 && i/10000%10!=i/100000%10) .filter(i-> i/100000%10!=i/1000000%10) .findFirst() .getAsInt(); System.out.println(inte);//result = 1034289Versión asistida de WJS
IntStream .iterate(1, i-> i + 1) .filter(i->isSquareNumber(i) && i<= 9999999 && 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()));Funciona maravillosamente. Y ahora estoy tratando de dar un paso más que crea un método en el que el tipo de devolución es un número entero y devuelve el número entero de dígitos más distinto, pero no un valor booleano.
Prueba esto. Lo limité a los primeros 10 valores.
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]));huellas dactilares
100000 --> 10 100001 --> 10 100002 --> 102 100003 --> 103 100004 --> 104 100005 --> 105 100006 --> 106 100007 --> 107 100008 --> 108 100009 --> 109Encuentra el primer número que tiene 7 dígitos distintos.
Después de crear las matrices en el ejemplo anterior, reemplace forEach con un filtro, seguido de findFirst y luego imprima el valor si está presente.
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()));Huellas dactilares
1023456 --> 7Para encontrar todos los números que son cuadrados que tienen al menos 7 dígitos distintos:
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();Para encontrar solo el primero (o explotar intentando, pero hay 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);En lugar de iterar sobre cada número, estoy iterando sobre la raíz cuadrada y luego elevándola al cuadrado, por lo que es mucho más eficiente.