2016-07-07 1 views
3

BigIntegerの配列を作成しようとしていますが、配列自体が整数でインデックスを作成する必要があるようです(trueの場合は非常に愚かですが、私は何かを誤解していると思っています)。BigIntegersでBigIntegerの配列をインデックスする方法

BigInteger totalChoiceFunctions = BigInteger.valueOf(50031545098999704); 
BigInteger[][] choiceFunctions = new BigInteger[totalChoiceFunctions][36]; 

しかし、これはエラー「型の不一致を:intにBigIntegerのから変換することはできません」原因:私は何をしようとしていることは、基本的に次のようです。これを解決するために、私は試しました:

BigInteger[][] choiceFunctions = new BigInteger[totalChoiceFunctions.intValue()][36]; 

しかし、これは役に立たないようです。私は、コンパイルと実行が、私はのランタイムエラーを取得する場合:

exception in thread 'main' java.lang.NegativeArraySizeException 

混乱を、私はBigIntegerののintValue()メソッドは、Oracleのマニュアルを見て、このBigIntegerがintに収まるように大きすぎる」ことがわかりました下位32ビットのみが返されます。この変換によって、BigInteger値の全体的な大きさに関する情報が失われ、逆の結果が返されることに注意してください。 50031545098999704がint型ではあまりにも大きすぎると考えています(なぜ、配列を1から50031545098999704までのインデックスでインデックス付けしたいので、BigIntegersの配列に向けるのはなぜですか)。

私の理解では、その後、正しい場合:

BigInteger[][] chioceFunctions = new BigInteger[totalChoiceFunctions][36]; 

のBigIntegerの配列を作成しますがはint型でをインデックス化はまだです。 BigIntegersによってストアされ、インデックス付けされる配列を作成するにはどうすればよいですか?出来ますか?このために私が使用しているコードはint型ではなくlong型を使用すると動作するかもしれませんが、BigIntegersでインデックスを作成するようなサイズにしたいと考えています。私は明白な何かを欠いていますか

+0

なぜこれが馬鹿に見えるのですか?インデックスの値は、格納できるオブジェクトの数だけを決定します。もっと多くのデータを格納する必要がある場合は、独自のコンテナを作成してください。 – ChrisCM

+3

Java配列の制限を無視しても、50桁から36桁のBigInteger配列のメモリはありません。 – user2357112

+1

あなたが必要とするメモリがどれくらいありますか?50031545098999704 * 64 * 36 ' –

答えて

4

配列はスパースではありませんので、あなたの配列は、約200 000テラバイトを必要とする内部行列を作成するためのアルゴリズムは、このようなものです(参照される配列/ BigIntegerを含まない)。そう、いいえ、現時点では不可能です。おそらくjava 10(おそらくjava9ではなく)の配列でインデックスとして長い間サポートする計画がいくつかあります。

私は実際には疎なデータ構造が必要だと思います。地図<のBigInteger、BigIntegerの>か、ネストされた配列の地図<タプル<のBigInteger、整数>を持っているように、BigIntegerの>はあなたのために働く必要があります。

2

いいえ、できません。 javaでは、すべての配列は整数だけでインデックスされます。

+0

これを正当に回答してください。 :)。 –

2

理論的には(実用的ではありませんが)、そのようなクラスを作成できます。

通常の配列では、動的にサイズを増やすことはできません。しかしArrayListできます!それはどうすればできますか?容量がいっぱいになると、より大きなサイズの新しい配列を再作成することで、

ここでも同じロジックを適用できます。

普通の配列は50031545098999704個のアイテムを保持できません。 複数の配列を作成することができます。

だからあなたのクラスでは、あなたが行列を持つ必要がありますが:

public class BigIntegerArray<T> { 
    private T[][] innerMatrix; 
} 

コンストラクタは右、配列の長さと数を受け入れるために起こっていますか?配列の長さを使用すると、必要な配列の数が分かります。配列のサイズがInteger.MAX_VALUE < N <= Integer.MAX_VALUE * 2 Nである場合たとえば、あなたは、このような内部行列を初期化する必要があることを知っている:

innerMatrix = new T[2][Integer.MAX_VALUE]; 

はいくつかの数学を使用します!

そして、あなたはgetsetメソッドを実装したいと思います。インデックスがInteger.MAX_VALUE * 2からInteger.MAX_VALUEより大きく以下である場合には、このようにアクセス:あなたは私が何を意味するかを取得

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 

アクセス部分は似ています:Javaで

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] 
1

Javaはintによってインデックスを作成します。Integer.MAX_VALUEは2バイトの1バイトで、2147483647の1バイトです。この配列にはこれ以上の数値を格納できません。あなたは、例えば以上int限界スケールデータ構造を使用しなければならない

mapsMapsはとしてだけで任意の制限なしに、ここにあなたがそれらを保存することができ2D Arrayのように動作します: - シンプル2D arrayと比較して挿入し、検索が少し難しくなります

Map m = new HashMap<BigInteger,BigInteger>(); 

だけint、我々を使用して、インデックスの限界を考慮します別のアプローチをしなければならない。

関連する問題