填充数字范围的数组

是否有任何语法/包允许快速填充具有数字范围的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] 

另外,这里有一个包,允许在如上所述的数字列表中获得第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 

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

不像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 values = concat(range(1, 10), range(500, 1000)); List list = newLinkedList(values); int[] array = toArray(list); } public static List range(int min, int max) { List list = newLinkedList(); for (int i = min; i <= max; i++) { list.add(i); } return list; } } 

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

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

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

 int[] range = IntStream.rangeClosed(1, 10).toArray(); 

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

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

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

有美元 :

 // build the List 10, 11, 12, 13, 14 List list2 = $(10, 15).toList(); 

行家:

  org.bitbucket.dollar dollar 1.0-beta3  

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

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

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

 Set numbersFrom1To500 = ContiguousSet.create(Range.closed(1, 500), DiscreteDomain.integers()); 

生成的Set不会在物理上包含指定的元素,只是逻辑上(因此它的内存占用量很小),但可以迭代(因为它是一个Set ):

 for (Integer integer : numbersFrom1To500) { System.out.println(integer); } 

现有arrays的另一个有用且未广为人知的Java 8解决方案:

 int[] array = new int[10]; Arrays.setAll(array, i -> i + 1); 
  List arrayOfRange = new ArrayList(); int[] range = IntStream.iterate(1, n -> {arrayOfRange.add(n);return n + 1;}).limit(10).toArray(); 

//如果你想拥有Integer 2nd approch,那么除了克雷格的答案

 List list = IntStream.of(range).boxed().collect(Collectors.toList());