【发布时间】:2012-10-09 12:14:48
【问题描述】:
在 Java 中有没有办法做类似的事情:
int foo[] = new int[0..n];
即
foo[0] = 0
foo[3] = 3
【问题讨论】:
-
不幸的是没有:'(看这个:stackoverflow.com/questions/2950386/…
在 Java 中有没有办法做类似的事情:
int foo[] = new int[0..n];
即
foo[0] = 0
foo[3] = 3
【问题讨论】:
不使用内置语言功能。当然,您可以轻松地编写一个方法来执行此操作,但没有内置任何内容 - 我怀疑它很少有用,因此在许多第三方实用程序库(例如 Guava)中也没有。
【讨论】:
Range.closed(0, 3).asSet(DiscreteDomains.integers()).asList()。这是一口,但那是因为你真的应该自己做。
我不这么认为,但你可以使用一个简单的 for 循环:
int foo[n];
for(int i = 0; i < n; i++) foo[i] = i;
如果您想要一种方法,请尝试以下方法:
public void initialize(int[] array, int start, int end) {
int array_length = array.length;
if (end > array_length) end = array_length;
for (int i = start; i < end; i++) {
array[i - start] = i;
}
}
// In any other point in your code
int foo[] = new int[6];
initialize(foo, 0, 10);
另一种方法是创建一个 Range 类来添加此功能:
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Range implements Iterable<Integer> {
Integer array[];
public Range(int size) {
this(0, size - 1);
}
public Range(int start, int end) {
array = new Integer[end - start];
for (int i = start; i < end; i++) {
array[i - start] = i;
}
}
public List<Integer> asList() {
return Arrays.asList(array);
}
@Override
public Iterator<Integer> iterator() {
return Arrays.asList(array).iterator();
}
}
这是一个用法示例:
Range range = new Range(4, 10);
for (int i : range) {
System.out.println(i);
}
我确信这段代码可以改进,但不值得。
【讨论】:
[n+1] 和i <= n。至少,我希望像 OP 的 new int[0..n] 这样的符号将包括两个端点,0 和 n。
int n = 10;
int[] arr = new int[n+1];
for 循环具有灵活的语法,因此您甚至可以这样做:
for ( int i = 0; i < arr.length; arr[i] = i++ );
附:
如果你想要比上面更少的代码,你可以这样做:
int i = 0;
for ( int c : arr ) { arr[i] = i++; }
附言
尽管这些代码片段很简洁,但对我来说它们似乎不清楚,而且闻起来很糟糕。
【讨论】: