使用数字范围填充数组

Dav*_*d B 27 java arrays

是否有任何语法/包允许快速填充具有数字范围的java数组,例如perl?

例如

int[] arr = new int[1000];
arr=(1..500,301..400,1001..1400); // returns [1,2,3,4,...,500,301,302,...,400,1001,1002,...1400]
Run Code Online (Sandbox Code Playgroud)

此外,这里有一个包,允许在如上所述的数字列表中获取第n个数字,而不实际创建数组(可能是巨大的)?

例如

BunchOfRangesType bort = new BunchOfRangesType("1..500","301..400","1001..1400");
bort.get(0); // return 1
bort.get(500); // return 301
bort.get(501); // return 302
Run Code Online (Sandbox Code Playgroud)

实现起来并不困难,但我想这可能很常见,也许它已经完成了.

Cra*_*aig 94

对于那些仍在寻找解决方案的人:

在Java 8或更高版本中,可以使用没有任何循环或其他库的Streams来轻松地回答这个问题.

int[] range = IntStream.rangeClosed(1, 10).toArray();
Run Code Online (Sandbox Code Playgroud)

这将生成一个整数为1到10的数组.

产生相同结果的更通用的解决方案如下.这可以通过修改一元运算符来产生任何序列.

int[] range = IntStream.iterate(1, n -> n + 1).limit(10).toArray();
Run Code Online (Sandbox Code Playgroud)

  • 对于那些想要在列表中包含结果范围的人(像我一样),您可以使用 `IntStream.rangeClosed(1, 10).boxed().collect(Collectors.toList())`(归功于 https:// stackoverflow.com/questions/23674624/how-do-i-convert-a-java-8-intstream-to-a-list) (4认同)

Tru*_*oft 18

美元:

// build the List 10, 11, 12, 13, 14
List<Integer> list2 = $(10, 15).toList();
Run Code Online (Sandbox Code Playgroud)

行家:

<dependency>
        <groupId>org.bitbucket.dollar</groupId>
        <artifactId>dollar</artifactId>
        <version>1.0-beta3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 它可以作为maven依赖吗?我找不到那样的东西.. (2认同)
  • 经过进一步审查,“dollar”似乎是一个将 $ 方法定义为 Dollar 类的静态方法的库。由于链接已失效,几乎不可能真正找到相关代码。所以这个答案毫无用处。完整的 java 语法需要将其调用为 Dollar.$(10, 15).toList()。 (2认同)

Kat*_*ona 8

至于第一个问题,是否可以使用范围的值填充数组:实际上可以通过组合Range,DiscreteDomain,ContiguousSet和来自Guava的Ints来实现:

int[] array = Ints.toArray(
    ContiguousSet.create(Range.closed(1, 500), DiscreteDomain.integers()));
Run Code Online (Sandbox Code Playgroud)

并且,不完全是问题的第二部分中提到的内容,但是可以使用一系列离散域的元素创建一个集合:

Set<Integer> numbersFrom1To500 = 
    ContiguousSet.create(Range.closed(1, 500), DiscreteDomain.integers());
Run Code Online (Sandbox Code Playgroud)

结果Set将不包含物理上的指定元素,仅在逻辑上(因此它的内存占用量很小),但可以迭代(因为它是a Set):

for (Integer integer : numbersFrom1To500) {
    System.out.println(integer);
}
Run Code Online (Sandbox Code Playgroud)


Jar*_*ell 7

不像True Soft的答案那么干净,但你可以使用Google Guava达到同样的效果:

public class Test {

    public static void main(String[] args) {
        //one liner
        int[] array = toArray(newLinkedList(concat(range(1, 10), range(500, 1000))));

        //more readable
        Iterable<Integer> values = concat(range(1, 10), range(500, 1000));
        List<Integer> list = newLinkedList(values);
        int[] array = toArray(list);

    }

    public static List<Integer> range(int min, int max) {
        List<Integer> list = newLinkedList();
        for (int i = min; i <= max; i++) {
            list.add(i);
        }

        return list;
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,您需要一些静态导入才能生效.

  • "请注意,您需要一些静态导入才能使其正常工作"将它们包含在您的代码中会很有帮助.range(...)可以在com.google.common.collect中找到.范围toArray(Range <T>)可以在com.google.common.collect中找到.Iterables newLinkedList(..)可以在com中找到. google.common.collect.Lists (5认同)

Man*_*dis 5

针对现有阵列的另一种有用且尚未广为人知的Java 8解决方案:

int[] array = new int[10];
Arrays.setAll(array, i -> i + 1);
Run Code Online (Sandbox Code Playgroud)