47

在java中有没有这么快的东西?(快速编码)

int [] a = {1..99};

或者我必须这样做:

int [] a=new int[100];
for (int i=0;i <100;++i){
a[i]=i;
}
4

8 回答 8

111

Java 8 开始,这是可能的:

int[] a = IntStream.range(1, 100).toArray();

(并且比其他 java 8 答案短。)。

于 2016-11-11T19:31:02.680 回答
21

如果您使用 Java 8,则另一种选择:

int[] array = new int[100];
Arrays.setAll(array, i -> i + 1);

lambda 表达式接受单元格的索引,并返回要放入该单元格的值。在这种情况下,单元格 0 - 99 被分配值 1-100。

于 2017-04-27T17:12:12.253 回答
17

Java 8 允许在一行中使用IntStream对象和 lambda 表达式来做到这一点:

int n = 10;
int[] values = new int[n];
IntStream.range(1,n+1).forEach(val -> values[val-1] = val);
于 2015-09-07T10:25:36.617 回答
16

出于好奇,我测试了该方法的两个版本的性能——一个使用循环,另一个使用番石榴:

public int[] loop() {
    int[] a = new int[100];
    for (int i = 0; i < 100; ++i) {
        a[i] = i;
    }
    return a;
}

public int[] guava() {
    Set<Integer> set = ContiguousSet.create(Range.closed(0, 99), DiscreteDomains.integers());
    int[] a = Ints.toArray(set);
    return a;
}

结果如下:

Benchmark     Mean     Mean error          Var    Units
loop        79.913          5.671       30.447  nsec/op
guava      814.753         46.359     2034.726  nsec/op

因此,该guava()方法的运行时间为 814 ns +/- 46ns,而该方法的运行时间为 80 ns +/- 5ns loop()。所以loop()大约快 10 倍。如果您多次调用该方法,则 800 纳秒无关紧要,如果您经常调用它,编写循环可能会更好。

于 2013-04-15T17:33:50.860 回答
2

我认为您的代码是最短最简单的方法。您可能不需要加载额外的库来获得更多“紧凑”的代码行。for循环非常简单(真正的 O(n))并且清晰易读,并且喜欢它们。

于 2013-04-15T17:11:22.833 回答
1

根据您必须循环的大小,如果它很小,您可以执行以下操作...

int[] intArray = new int[] {4,5,6,7,8};

我猜你的尺寸你不想把它全部打出来所以创建一个循环并设置它是有意义的

于 2013-04-15T17:04:38.370 回答
0

您必须使用循环来初始化这样一个长数组。正如您所料,Java 中没有快捷方法。

于 2013-04-15T17:06:22.787 回答
0

您可以使用 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;
}

}

更新:完整示例取自这篇文章用数字范围填充数组

于 2013-04-15T17:06:56.857 回答