【问题标题】:Quick call to generate array containing number from 0 to N快速调用生成包含从 0 到 N 的数字的数组
【发布时间】:2013-08-15 15:58:07
【问题描述】:

这里的问题很简单——主要是关于 API。

我想以随机顺序遍历一个数组。

这很容易:

  1. 用数字 0 到 N 填充列表
  2. 使用 Collections.shuffle 打乱列表
  3. 使用这个打乱的列表来指导我的数组迭代。

但是,我想知道步骤 1(生成从 0 到 N 的数字列表)是否存在于预先编写的代码中。

例如,它可以是 guava 的 XYZ 类中的便捷方法吗??

【问题讨论】:

  • 编写自己的方法很容易做到这一点。
  • 同意,但是像 Doubles.compare(double d1, double d2) 这样的小型便捷方法使代码更具可读性。如果我可以替换一个 for 循环并了解一批可能有用的便利方法,那就太好了。

标签: java


【解决方案1】:

Guava 中最接近的东西是

ContiguousSet.create(Range.closedOpen(0, n), DiscreteDomains.integers())

...但是,坦率地说, 自己编写 for 循环可能更具可读性。

【讨论】:

  • 谢谢。番石榴中的小东西真的很有帮助。这就是我问的部分原因——以防有另外一批我不知道的小“可读性方法”。
  • 在某些情况下,Guava 开发人员可能会认为事情是“反可读性方法”,我怀疑这可能就是这样一种情况。
【解决方案2】:

特别注意到您对“快速”的强调,我无法想象会有比

List<Integer> = new ArrayList<Integer>(range);

然后迭代并填充每个条目。请注意,我设置了容量是为了避免在封面下调整列表大小。

【讨论】:

    【解决方案3】:

    您可能想查看Apache Commons,其中包括许多其他有用的功能,在RandomDataGenerator 类中实现nextPermutation 方法

    这显然比填充Listarray 的方法要大得多,但是commons 是非常强大的库,它为数学计算提供了更多好的方法。

    【讨论】:

      【解决方案4】:

      Java 不允许您自动填充值。有关在 java 中填充数组的方法,请参阅此问题

      Creating an array of numbers without looping?

      【讨论】:

        【解决方案5】:

        如果您跳过第 1 步并立即进行改组,我认为您将获得最快的解决方案。

        int range = 1000;
        List<Integer> arr = new ArrayList<Integer>(range);
        for(int i=0;i<range;i++) {
            arr.add((int)(Math.random()*i), new Integer(i));
        }
        

        【讨论】:

          猜你喜欢
          • 2019-07-23
          • 2021-02-14
          • 1970-01-01
          • 1970-01-01
          • 2016-02-12
          • 1970-01-01
          • 2014-02-27
          • 2020-04-01
          • 2014-10-17
          相关资源
          最近更新 更多