如果索引范围为long,则迭代数组

问题描述 投票:0回答:3

如何在Java中迭代数组/列表。如果索引范围很长。由于数组/列表只接受位置索引中的整数。

例如

long arr[]=new long[5];
for(long i=0l;i<5l;i++)
     arr[i]=i;  // throw an error as arr[i] only accept integer

这里arr[i]将抛出一个错误,因为我是long类型,数组在索引位置输入integer

任何人都可以帮我解决这个问题吗?

java arrays data-structures long-integer
3个回答
2
投票

数组上的大小limit1是Integer.MAX_VALUE,因此数组索引是long毫无意义。

List可以拥有超过Integer.MAX_VALUE元素,但索引它将是有问题的,因为List::get采取int论点。

因此,您将很难使用数组或列表(使用List实现)来实现真正的大型数据结构。

解决方案......如果你真的需要一个...将实现你自己的List类,带有重载或替代暴露大小和索引的操作。这不会是微不足道的。

另一种(可能更简单)的方法是将你的long[]表示为long[][]并映射下标。

最后,如果你不必要地使用long作为下标(即索引不需要超出Integer.MAX_VALUE),那么:

   long arr[] = new long[5];
   for (long i = 0l; i < 5l; i++) {
       arr[(int) i] = i; 
   }

1 - 这是理论最大尺寸。 1)如果你试图分配一个大的数组,你可能会得到一个OutOfMemoryError。 JVM至少需要length * size(<type>)字节的自由连续存储来分配长度为<type>length数组,其中size(<type>)是基本类型或引用的大小。 2)在32位JVM中,您还受到地址空间维度的限制。 3)在最近的Hotspot JVM中,你可以分配的最大数组实际上是Integer.MAX_VALUE - 5元素:参见Do Java arrays have a maximum size?


0
投票

即使你的数组​​包含long,你也不需要索引为long's。将其更改为

for(int i = 0; ....)

0
投票

两种解决方案

  1. 通过演员longinteger缩小到arr[(int)i] = i;
  2. i的类型更改为integer并让编译器在分配时为你扩展for(int i = 0; i < 5; i++) arr[i] = i;

由于无法将所有长值映射到整数,因此编译器不会自动缩小变量。由于您可以将所有整数值映射到long,编译器将自动为您扩展变量。

© www.soinside.com 2019 - 2024. All rights reserved.