java—通过lambda表达式查找第一个具有最明显数字的

polkgigr  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(500)

目前,我正在学习在同一个lambda表达式中使用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 && <= 9_999_999 && 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) && 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 = 1034289

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()));

它工作得很好。现在我尝试再移动一步,创建一个方法,其中返回类型是整数,返回最明显的数字整数,但不是布尔值。

oewdyzsn

oewdyzsn1#

试试这个。我将其限制为前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 使用筛选器,后跟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
46qrfjad

46qrfjad2#

要查找所有具有至少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);

我不是迭代每个数字,而是迭代平方根,然后平方它,这样效率会更高。

相关问题