【问题标题】:How can I get a range of integers but exclude some numbers?如何获得整数范围但排除某些数字?
【发布时间】:2019-05-14 00:08:33
【问题描述】:

我需要创建一个整数数组,其中将包含 0 到 53 之间的所有数字,但我想从数组中排除其中一些整数。 Java有什么功能可以做到吗?

我有一个包含排除项的数组。这背后没有逻辑(其实是有逻辑的,但是我不知道怎么表达),所以我创建了一个数组来指定:

int[] exclusions = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53};

我看到an example 看到了类似于我想做的事情,但在 C# 中(这个问题是关于一个随机数,这不是我想要的,但类似于)。

【问题讨论】:

  • 对于文本中的任何语法错误,我深表歉意。我是英语新手。
  • IntStream.range(0, 53).filter(i -> ...).toArray()
  • 你的语法看起来不错。什么决定了哪些数字将被删除?而且范围非常小,您可以创建一个数字列表并根据需要从中删除。或者维护一组排除的数字,并在必要时进行检查。
  • @Carcigenicate 谢谢。没有逻辑来规定将删除哪些数字。我有一个包含我需要的所有排除项的数组(忘记在帖子中包含这个,天哪)。但是您的想法看起来不错,必要时检查排除组。如果没有提出解决方案,我会使用它。
  • @Brunno shmosel 的解决方案相当地道。过滤函数 oukd 定义了保留的内容。我会去的。如果您还没有使用流,这也是学习流的好方法。

标签: java range


【解决方案1】:

您可以创建一组要排除的数字并过滤IntStream.range产生的数字:

Set<Integer> exclusions = new HashSet<>();
// add numbers to set
...
int[] numbers = IntStream.range(0,53)
    .filter(n -> !exclusions.contains(n))
    .toArray();

【讨论】:

    【解决方案2】:

    您可以通过多种方式进行操作。首先是使用 IntStream 的concat 功能。下面生成一个 0-5、10-15 和 20-25 的列表。

          int[] vals = IntStream.concat(
                IntStream.concat(IntStream.range(0, 6), IntStream.range(10, 16)),
                IntStream.range(20, 26)).toArray();
          System.out.println(Arrays.toString(vals));
    

    您也可以只包含要排除的这些数字的列表。此示例排除了过滤器列表中的那些。

          int[] vals2 = IntStream.range(0, 54).filter(
                a -> !List.of(10, 20, 30, 40).contains(a)).toArray();
          System.out.println(Arrays.toString(vals2));
    

    【讨论】:

    • Stream.of(Range A, Range B, Range C).flatMapToInt(x -> x) ,每当想到多个流时,我觉得最好扁平化
    • @Yugansh 我肯定会采用你的方法!
    猜你喜欢
    • 2013-12-22
    • 2022-01-12
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多