我正在尝试构建一个BigIntegers数组,但似乎数组需要由整数自己索引(如果是真的,那对我来说似乎非常愚蠢,但我希望我只是误解了一些东西) 。我正在尝试的主要是以下内容:
BigInteger totalChoiceFunctions = BigInteger.valueOf(50031545098999704);
BigInteger[][] choiceFunctions = new BigInteger[totalChoiceFunctions][36];
但是这会导致错误“类型不匹配:无法从BigInteger转换为int”。为了解决这个问题,我尝试了:
BigInteger[][] choiceFunctions = new BigInteger[totalChoiceFunctions.intValue()][36];
然而,这似乎没有帮助。当我编译并运行时,我得到运行时错误:
exception in thread 'main' java.lang.NegativeArraySizeException
困惑,我看了一下BigInteger的intValue()方法的oracle文档,发现“如果这个BigInteger太大而不适合int,只返回低位32位。注意这个转换可以丢失有关BigInteger值的总体大小的信息,并返回具有相反符号的结果“。我怀疑这是正在发生的事情,考虑到50031545098999704对于int来说肯定太大了(为什么我转向BigIntegers数组,因为我希望我的数组被1到50031545098999704的数字索引)。
如果我的理解是正确的,那么:
BigInteger[][] chioceFunctions = new BigInteger[totalChoiceFunctions][36];
创建一个存储 BigIntegers的数组,但仍然是由ints 索引。如何创建一个存储并由BigIntegers索引的数组?可能吗?请注意,我使用此代码的代码在这种情况下可能能够工作,如果我使用long而不是int来索引,但我希望它扩展到我将被迫由BigIntegers索引的大小。我错过了一些明显的东西吗?
答案 0 :(得分:4)
java中的数组不稀疏,因此您的数组需要大约200 000 TB(不包括引用的数组/ BigIntegers)。所以不,目前不可能。有一些计划支持long作为数组中的索引,可能是java 10(当然不是java9)。
我猜你真的想要一个稀疏的数据结构;地图< BigInteger,BigInteger>或者你有一个嵌套数组Map< Tuple< BigInteger,Integer>,BigInteger>应该适合你。
答案 1 :(得分:2)
不,这是不可能的。在java中,所有数组都只用整数索引。
答案 2 :(得分:2)
理论上(但不实用),你可以创建这样一个类。
普通数组不能动态增加其大小,对吗?但是ArrayList
可以!它怎么能这样做?好吧,当容量已满时,通过重新创建一个更大尺寸的新阵列。
你可以在这里应用相同的逻辑。
普通阵列无法容纳50031545098999704个项目。 但是你可以创建多个数组来保存它们!
所以在你的班上,你应该有一个矩阵:
public class BigIntegerArray<T> {
private T[][] innerMatrix;
}
构造函数将接受一个数字作为数组长度,对吧?使用数组长度,您可以知道需要多少个数组。例如,如果数组大小为N Integer.MAX_VALUE < N <= Integer.MAX_VALUE * 2
,您知道应该像这样初始化内部矩阵:
innerMatrix = new T[2][Integer.MAX_VALUE];
只是使用一些数学!
您希望实施get
和set
方法。如果索引大于Integer.MAX_VALUE
但小于或等于Integer.MAX_VALUE * 2
,请按以下方式访问:
innerArray[1][index - Integer.MAX_VALUE]; // not real code. I'm just illustrating the point.
你理解我的意思?这基本上是简单的数学。
编辑:
也许我没解释得这么好。创建内部矩阵的算法如下:(伪代码)
if arraySize is smaller than Integer.MAX_VALUE then
create an array of size arraySize
return
initialize a variable counter to 0
while arraySize > 0
subtract Integer.MAX_VALUE from arraySize
increment counter
create an array with the array size of counter
访问部分类似:
if index is smaller than Integer.MAX_VALUE then
access [0][index]
return
initialize a variable counter to 0
while arraySize > 0
subtract Integer.MAX_VALUE from arraySize
increment counter
access [counter][index - Integer.MAX_VALUE * counter]
答案 3 :(得分:1)
Java只允许你按int
索引你可以实现的最大索引是Integer.MAX_VALUE
,它是2 GB的1字节,即2147483647.你的数组不能容纳大于此值的数字。
您应该使用扩展超过int
限制的数据结构,例如maps
。 Maps
的行为只有2D Array
,没有任何限制,您可以将其存储为: -
Map m = new HashMap<BigInteger,BigInteger>();
与简单的2D array
相比,插入和检索会稍微困难一些,但考虑到仅使用int
的索引的局限性,我们必须采用另一种方法。