是否有任何语法/包允许快速填充带有数字范围的java数组,例如perl?
e.g。
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个数字,而不实际创建数组(可能很大)?
e.g。
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
实施起来并不算太难,但我想这可能很常见,所以可能已经完成了。
答案 0 :(得分:82)
对于那些仍在寻找解决方案的人:
在Java 8或更高版本中,可以使用没有任何循环或其他库的Streams来轻松地回答这个问题。
int[] range = IntStream.rangeClosed(1, 10).toArray();
这将生成一个整数为1到10的数组。
产生相同结果的更通用的解决方案如下。这可以通过修改一元运算符来产生任何序列。
int[] range = IntStream.iterate(1, n -> n + 1).limit(10).toArray();
答案 1 :(得分:17)
有dollar:
// build the List 10, 11, 12, 13, 14
List<Integer> list2 = $(10, 15).toList();
行家:
<dependency>
<groupId>org.bitbucket.dollar</groupId>
<artifactId>dollar</artifactId>
<version>1.0-beta3</version>
</dependency>
答案 2 :(得分:8)
不像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;
}
}
请注意,您需要一些静态导入才能生效。
答案 3 :(得分:8)
至于第一个问题,是否可以使用范围的值填充数组:实际上可以通过Range,DiscreteDomain,{{3来自ContiguousSet的{}和Ints:
int[] array = Ints.toArray(
ContiguousSet.create(Range.closed(1, 500), DiscreteDomain.integers()));
而且,问题的第二部分并没有提到,但是可以使用一系列离散域的元素创建一个集合:
Set<Integer> numbersFrom1To500 =
ContiguousSet.create(Range.closed(1, 500), DiscreteDomain.integers());
结果Set
不会在物理上包含指定的元素,只是逻辑上(因此它的内存占用量很小),但可以迭代(因为它是Set
):
for (Integer integer : numbersFrom1To500) {
System.out.println(integer);
}
答案 4 :(得分:5)
现有阵列的另一个有用且未广为人知的Java 8解决方案:
int[] array = new int[10];
Arrays.setAll(array, i -> i + 1);
答案 5 :(得分:1)
List<Integer> arrayOfRange = new ArrayList<Integer>();
int[] range = IntStream.iterate(1, n -> {arrayOfRange.add(n);return n + 1;}).limit(10).toArray();
//如果你想拥有整数,除了克雷格的答案 第二个approch
List<Integer> list = IntStream.of(range).boxed().collect(Collectors.toList());