我想返回一个由没有出现在任何参数编号中的数字(按升序)组成的字符串。我不知道这应该怎么做,但我想使用 long 作为比较器来找出 IntStream 中丢失的数字。
例如,如果numeros = [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();
Run Code Online (Sandbox Code Playgroud)
这个问题有很多解决方案,其中之一是简单的集合移除。您基本上想从有效数字集中删除所有使用过的数字,并将结果存储为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());
}
Run Code Online (Sandbox Code Playgroud)
当使用您的 示例调用时[1201L, 23045L],输出是您所期望的:
6789
Run Code Online (Sandbox Code Playgroud)
Andy Turner 还提到使用 aBitSet可能是一个可行的解决方案。如果您选择使用一个,您的解决方案可能如下所示:
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());
}
Run Code Online (Sandbox Code Playgroud)