如何在Java中生成序列整数的列表或数组?
是否有一种简单快捷的方法来生成一个如何在Java中生成序列整数的列表或数组?,java,arrays,collections,guava,apache-commons,Java,Arrays,Collections,Guava,Apache Commons,是否有一种简单快捷的方法来生成一个列表,或者一个整数[]或int[],其中包含从一些开始值到结束值的顺序值 也就是说,短于但相当于以下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)
列表
,或者一个整数[]
或int[]
,其中包含从一些开始
值到结束
值的顺序值
也就是说,短于但相当于以下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;
}
在这里,图片变化很大,尽管非物化解决方案仍然是最快的。这里的长度=10:
。。。长度=10000:
对许多元素进行长时间的迭代会使事情变得更加均匀,但是eclipse和guava即使在10000个元素的测试中也保持了两倍以上的速度
因此,如果您真的想要一个列表
,eclipse集合似乎是最好的选择——但当然,如果您以更自然的方式使用流(例如,忘记.boxed()
,并在基本域中进行缩减),您可能会比所有这些变体更快
1可能除了错误处理之外,例如,如果
end
begin,或者如果大小超过一些实现或JVM限制(例如,大于2^31-1
的数组),这是我使用核心Java所能获得的最短长度
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;
}
List makeSequence(int开始,int结束){
List ret=新阵列列表(结束-开始+1);
对于(inti=begin;i那么,这一行可能符合(使用)
两者都产生:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
你可以用
您可以通过使用获取SortedSet
ImmutableSortedSet<Integer> set = Ranges.open(1, 5).asSet(DiscreteDomains.integers());
// set contains [2, 3, 4]
ImmutableSortedSet=Ranges.open(1,5).asSet(离散域.integers());
//集合包含[2,3,4]
这是我能找到的最短的
列表版本
public List<Integer> makeSequence(int begin, int end)
{
List<Integer> ret = new ArrayList<Integer>(++end - begin);
for (; begin < end; )
ret.add(begin++);
return ret;
}
公共列表生成序列(int开始,int结束)
{
List ret=新数组列表(++end-begin);
对于(;开始<结束;)
ret.add(begin++);
返回ret;
}
阵列版本
public int[] makeSequence(int begin, int end)
{
if(end < begin)
return null;
int[] ret = new int[++end - begin];
for (int i=0; begin < end; )
ret[i++] = begin++;
return ret;
}
public int[]生成序列(int开始,int结束)
{
如果(结束<开始)
返回null;
int[]ret=新int[++结束-开始];
对于(int i=0;开始<结束;)
ret[i++]=begin++;
返回ret;
}
这个可能适合你
void List<Integer> makeSequence(int begin, int end) {
AtomicInteger ai=new AtomicInteger(begin);
List<Integer> ret = new ArrayList(end-begin+1);
while ( end-->begin) {
ret.add(ai.getAndIncrement());
}
return ret;
}
void List makeSequence(int-begin,int-end){
AtomicInteger ai=新的AtomicInteger(开始);
List ret=新阵列列表(结束-开始+1);
while(结束-->开始){
ret.add(ai.getAndIncrement());
}
返回ret;
}
Java 8非常简单,甚至不再需要单独的方法:
List<Integer> range = IntStream.rangeClosed(start, end)
.boxed().collect(Collectors.toList());
List range=IntStream.range关闭(开始、结束)
.boxed().collect(collector.toList());
以下一行Java 8版本将生成[1,2,3…10]。迭代的第一个参数是序列中的第一个nr,限制的第一个参数是最后一个数字
List<Integer> numbers = Stream.iterate(1, n -> n + 1)
.limit(10)
.collect(Collectors.toList());
List number=Stream.iterate(1,n->n+1)
.限额(10)
.collect(Collectors.toList());
您可以使用中的类
您的方法可以按如下方式实现:
public List<Integer> makeSequence(int begin, int end) {
return Interval.fromTo(begin, end);
}
Interval integers = Interval.oneTo(10);
Set<Integer> set = integers.toSet();
List<Integer> list = integers.toList();
Bag<Integer> bag = integers.toBag();
IntList
在界面上提供了方法sum()
、min()
、minIfEmpty()
、max()
、maxIfEmpty()
、average()
和media()
清晰更新:2017年11月27日
间隔
是一个列表
,但它是惰性的和不可变的。它对于生成测试数据非常有用,特别是当您处理大量集合时。如果需要,您可以轻松地将间隔复制到列表
,设置
或包
,如下所示:
public List<Integer> makeSequence(int begin, int end) {
return Interval.fromTo(begin, end);
}
Interval integers = Interval.oneTo(10);
Set<Integer> set = integers.toSet();
List<Integer> list = integers.toList();
Bag<Integer> bag = integers.toBag();
区间
和区间
没有相同的等于
合约
更新的
您现在可以从基本流创建基本集合。根据您的偏好,有with all
和of all
方法。如果您好奇,我解释为什么我们有这两种方法。这些方法适用于可变和不可变的Int/Long/Double列表、集合、包和堆栈
Assert.assertEquals(
IntInterval.oneTo(10),
IntLists.mutable.withAll(IntStream.rangeClosed(1, 10)));
Assert.assertEquals(
IntInterval.oneTo(10),
IntLists.immutable.withAll(IntStream.rangeClosed(1, 10)));
注意:我是Eclipse集合的提交者int[]arr=IntStream.rangeClosed(2,5).toArray();
int[] arr = IntStream.rangeClosed(2, 5).toArray();
System.out.println(Arrays.toString(arr));
// [2, 3, 4, 5]
Integer[] boxedArr = IntStream.rangeClosed(2, 5)
.boxed().toArray(Integer[]::new);
System.out.println(Arrays.toString(boxedArr));
// Since Java 16
List<Integer> list1 = IntStream.rangeClosed(2, 5)
.boxed().toList();
System.out.println(list1);
List<Integer> list2 = IntStream.rangeClosed(2, 5)
.boxed().collect(Collectors.toList());
System.out.println(list2);
List<Integer> list3 = Arrays.asList(boxedArr);
System.out.println(list3);
List<Integer> list4 = new ArrayList<>();
IntStream.rangeClosed(2, 5).forEachOrdered(list4::add);
System.out.println(list4);
System.out.println(Arrays.toString(arr));
// [2, 3, 4, 5]
整数[]boxedArr=IntStream.rangeClosed(2,5)
.boxed().toArray(整数[]:新);
System.out.println(Arrays.toString(boxedArr));
//自Java 16以来
List list1=IntStream.rangeClosed(2,5)
.boxed().toList();
System.out.println(列表1);
List list2=IntStream.rangeClosed(2,5)
.boxed().collect(collector.toList());
System.out.println(列表2);
List list3=Arrays.asList(boxedArr);
System.out.println(列表3);
List list4=新的ArrayList();
IntStream.rangeClosed(2,5).forEachOrdered(list4::add);
System.out.println(列表4);
对于apache commons,您可以通过将该循环更改为For(int i=begin;我不确定将ret.add(i)
部分移动到For循环增量中是否会使其“更短”。根据该逻辑,如果我将其全部写在一行中,它会更短:)@BeeOnRope是的,肯定不是最短的,但肯定要短两行:)正如我所说,这是最接近于在核心Java中缩短它的地方。我在上面的答案中添加了ClassicCarrayList标签。使用AtomicInteger对于Resources来说非常重要,在我的测试中大约慢十倍。但是对于多线程来说它是安全的。在方法内部使用AtomicInteger没有意义。所有方法调用中的语句是由调用该方法的线程按顺序运行的,因此从AtomicInteger中除了减慢和恼人的getAndIncrement()调用外,什么都得不到。除非您确实需要一个列表
。资产
生成的连续集
是轻量级的(它只需要范围和域),但是asList()
将创建一个列表,该列表实际存储内存中的所有元素
public IntList makeSequence(int begin, int end) {
return IntInterval.fromTo(begin, end);
}
Interval integers = Interval.oneTo(10);
Set<Integer> set = integers.toSet();
List<Integer> list = integers.toList();
Bag<Integer> bag = integers.toBag();
IntInterval ints = IntInterval.oneTo(10);
IntSet set = ints.toSet();
IntList list = ints.toList();
IntBag bag = ints.toBag();
Assert.assertEquals(
IntInterval.oneTo(10),
IntLists.mutable.withAll(IntStream.rangeClosed(1, 10)));
Assert.assertEquals(
IntInterval.oneTo(10),
IntLists.immutable.withAll(IntStream.rangeClosed(1, 10)));
int[] arr = IntStream.rangeClosed(2, 5).toArray();
System.out.println(Arrays.toString(arr));
// [2, 3, 4, 5]
Integer[] boxedArr = IntStream.rangeClosed(2, 5)
.boxed().toArray(Integer[]::new);
System.out.println(Arrays.toString(boxedArr));
// Since Java 16
List<Integer> list1 = IntStream.rangeClosed(2, 5)
.boxed().toList();
System.out.println(list1);
List<Integer> list2 = IntStream.rangeClosed(2, 5)
.boxed().collect(Collectors.toList());
System.out.println(list2);
List<Integer> list3 = Arrays.asList(boxedArr);
System.out.println(list3);
List<Integer> list4 = new ArrayList<>();
IntStream.rangeClosed(2, 5).forEachOrdered(list4::add);
System.out.println(list4);