【问题标题】:shortest way of filling an array with 1,2...n用 1,2...n 填充数组的最短方法
【发布时间】:2013-04-15 16:59:40
【问题描述】:

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

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

或者我必须这样做:

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

【问题讨论】:

标签: java arrays


【解决方案1】:

因为 Java 8 这是可能的:

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

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

【讨论】:

  • Arrays.setAll() 是一个更好的方法。
  • @Arkadiy 可能是一个口味问题,但恕我直言,使用IntStream#toArrayArrays#setAll 更好阅读。
  • 有什么方法可以创建用户定义类的数组吗?以同样的方式我们创建了int[] a
  • .rangeClosed方法是包容性的,将数组填充到100个元素int[] a = IntStream.rangeClosed(1, 100).toArray();docs.oracle.com/javase/8/docs/api/java/util/stream/…
  • 最低 API 级别为 24? ?
【解决方案2】:

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

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

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

【讨论】:

  • 与接受的答案相比,这方面的表现如何?
【解决方案3】:

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

int n = 10;
int[] values = new int[n];
IntStream.range(1,n+1).forEach(val -> values[val-1] = val);

【讨论】:

  • Arrays.setAll() 是一种更好的方法
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

      我猜测你的尺寸,你不想把它全部输入,所以创建一个循环并设置它是有意义的

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          }

          更新:完整示例取自这篇帖子Fill arrays with ranges of numbers

          【讨论】:

          • range 方法不是番石榴的一部分,而是在该答案中使用循环编写的。它在这里没有帮助。
          • 可能你是对的,我记得 ot 是这样的,但从链接的帖子中按原样举例
          猜你喜欢
          • 2012-02-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-18
          • 2019-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          相关资源
          最近更新 更多