当前位置: 首页 > 知识库问答 >
问题:

如何在Java中生成序列整数的列表或数组?

卢雅惠
2023-03-14

有没有一种简单的方法来生成列表

也就是说,比以下内容短,但相当于1

void List<Integer> makeSequence(int begin, int end) {
  List<Integer> ret = new ArrayList<>(end - begin + 1);
  for (int i=begin; i<=end; i++) {
    ret.add(i);
  }
  return ret;  
}

番石榴的使用是可以的。

更新:

由于这个问题已经得到了几个很好的答案,都是使用本机Java 8和第三方库,我想我应该测试所有解决方案的性能。

第一个测试使用以下方法简单地测试创建10个元素的列表[1...10]

  • 经典ArrayList:上面在我的问题中给出的代码(基本上与adarshr的答案相同)。
  • eclipseColl的代码:在唐纳德的答案下面给出的代码使用Eclipse集合8.0。
  • guavaRange:下面daveb回答中给出的代码。从技术上讲,这不会创建List

以下是每秒千次运算的结果(数字越大越好),对于以上所有大小为10的列表:

... 对于大小为10000的列表:

最后一张图表是正确的——除了Eclipse和Guava之外的解决方案太慢了,甚至连一个像素条都拿不到!快速解决方案比其他解决方案快1万到2万倍。

当然,这里发生的事情是,guava和eclipse解决方案实际上并没有实现任何类型的10000元素列表——它们只是围绕起点和终点的固定大小包装。每个元素都是在迭代过程中根据需要创建的。因为我们实际上没有在这个测试中迭代,所以成本被推迟。所有其他的解决方案实际上都在内存中实现了完整的列表,并且在一个仅创建的基准测试中付出了沉重的代价。

让我们做一些更现实的事情,并迭代所有的整数,求和。因此,在IntStream.range封闭变体的情况下,基准看起来像:

@Benchmark
public int intStreamRange() {
    List<Integer> ret = IntStream.rangeClosed(begin, end).boxed().collect(Collectors.toList());  

    int total = 0;
    for (int i : ret) {
        total += i;
    }
    return total;  
}

在这里,图片变化很大,尽管非物化解决方案仍然是最快的。这里的长度=10:

... 长度=10000:

在许多元素上的长时间迭代使事情平衡了很多,但是eclipse和番石榴即使在10,000个元素测试中也保持了两倍多的速度。

所以如果你真的想要一个列表

1错误处理除外,例如,如果end


共有3个答案

裴昊阳
2023-03-14

以下一行Java 8版本将生成[1,2,3…10]。iterate的第一个arg是序列中的第一个nr,limit的第一个arg是最后一个数字。

List<Integer> numbers = Stream.iterate(1, n -> n + 1)
                              .limit(10)
                              .collect(Collectors.toList());
翟永春
2023-03-14

嗯,这一条可能符合条件(使用番石榴系列)

ContiguousSet<Integer> integerList = ContiguousSet.create(Range.closedOpen(0, 10), DiscreteDomain.integers());
System.out.println(integerList);

这不会创建List

在较旧的版本中(Guava 14之前的某个地方),你可以使用:

ImmutableList<Integer> integerList = Ranges.closedOpen(0, 10).asSet(DiscreteDomains.integers()).asList();
System.out.println(integerList);

两者都产生:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

燕文昌
2023-03-14

Java 8非常简单,甚至不再需要单独的方法

List<Integer> range = IntStream.rangeClosed(start, end)
    .boxed().collect(Collectors.toList());
 类似资料:
  • 问题内容: 我需要使用表/结果集/任何包含整数(包括整数)的联接。是否有一种简单的方法来实现这一目标而不仅仅是构建表? (顺便说一句,这种类型的结构称为“ 元查询 ”吗?) 被限制在合理的范围内(<1000) 问题答案: MySQL中没有序列号生成器(CREATE SEQUENCE )。最近的是,它可以帮助您构造表。

  • 有一个unique的数组列表,我需要将它们在z大小的数组列表之间随机分布。请记住: 是可变值 一个示例是,当您有一个由8个元素组成的数组的原点,并且希望输出3个大小为6的数组时: 原始数组列表:[1, 2, 3, 4, 5, 6, 7, 8] 结果输出:[7,5,3,6,4,8],[7,5,1,8,2,3],[8,1,2,3,4,6] 我开发了一个算法,并在注释中进行了解释。首先,我创建了一个包含

  • 我正在尝试实现一个函数int choose_N(void),它生成并返回一个随机的整数列表N(最多四个整数)。我不确定我是否以正确的方式使用了rand(),但这是我目前所拥有的: 这样循环会有用吗?时间是否以正确的方式初始化?

  • 假设您在python中输入了一个数字,并且希望生成一个连续数字列表,最多为,如 你怎么能这么做?

  • 问题内容: 我正在尝试在MySQL中生成序列表,以便可以从获得唯一ID 。 问题是我需要动态地多个序列。 首先,我创建了一个表: 然后尝试使用http://dev.mysql.com/doc/refman/5.0/en/information- functions.html#function_last-insert- id中的 示例获取编号 一段时间后,我意识到我还需要安全地为新标签生成行。因此,

  • 我使用以下命令创建了一个名为hibernate_sequence的序列 这是我的hibernate注释dao 为了向表中插入新记录,hibernate正在生成错误的查询以获取下一个序列值。。Hibernate总是发出此查询。。不管我做什么。。 我使用的是oracle 10G,它总是报告以下错误。。 发出的查询应该是