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

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

目前,我正在学习在同一个lambda表达式中使用distinct()的函数:第一个用于查找整数的不同数字

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

然后我想在一个范围内找到同样的东西,我的想法是:

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

因为原来的代码可以工作,但是看起来很糟糕

  1. int inte = IntStream.iterate(1, i-> i + 1)
  2. .filter(i->isSquareNumber(i) && i<= 9999999 && i>=1000000)
  3. .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)
  4. .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)
  5. .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)
  6. .filter(i-> i/1000%10!=i/10000%10 && i/1000%10!=i/100000%10 && i/1000%10!=i/1000000%10)
  7. .filter(i-> i/10000%10!=i/10%10 && i/10000%10!=i/100000%10)
  8. .filter(i-> i/100000%10!=i/1000000%10)
  9. .findFirst()
  10. .getAsInt();
  11. System.out.println(inte);//result = 1034289

wjs帮助版

  1. IntStream
  2. .iterate(1, i-> i + 1)
  3. .filter(i->isSquareNumber(i) && i<= 9999999 && i>=1000000)
  4. .mapToObj(i->new String[] {Integer.toString(i), Arrays
  5. .stream(Integer.toString(i).split(""))
  6. .filter(a -> a[1].length() >= 7)
  7. .findFirst()
  8. .ifPresent(a -> System.out
  9. .println(a[1] + " --> " + a[1].length()));

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

oewdyzsn

oewdyzsn1#

试试这个。我将其限制为前10个值。
maptoobj创建一个字符串数组。
第一项是原值。
下一个将拆分字符串,消除重复项并重新连接到新字符串

  1. IntStream.range(100000, 1000000).limit(10)
  2. .mapToObj(i->new String[] {Integer.toString(i), Arrays
  3. .stream(Integer.toString(i).split(""))
  4. .distinct().collect(Collectors.joining(""))})
  5. .forEach(a->System.out.println(a[0] + " --> " + a[1]));

印刷品

  1. 100000 --> 10
  2. 100001 --> 10
  3. 100002 --> 102
  4. 100003 --> 103
  5. 100004 --> 104
  6. 100005 --> 105
  7. 100006 --> 106
  8. 100007 --> 107
  9. 100008 --> 108
  10. 100009 --> 109

找到第一个有7个不同数字的数字。
在上一个示例中创建数组之后,替换 forEach 使用筛选器,后跟findfirst,然后打印值(如果存在)。

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

印刷品

  1. 1023456 --> 7
展开查看全部
46qrfjad

46qrfjad2#

要查找所有具有至少7个不同数字的正方形数字,请执行以下操作:

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

只找到第一个(或尝试爆炸,但有123个):

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

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

相关问题