7

ユーザーが入力として入力するサイズのブール配列を作成したいと思います。たとえば、ユーザーは1000000000000のような大きな数値を入力する場合があります。したがって、サイズ1000000000000のブール配列を作成する必要があります。私が直面している問題は、入力をintとして格納できないことです。これは、このような大きな数を保持できないためです。したがって、配列を作成できません。Doubleはオプション。入力番号をdoubleとして格納できますが、double番号のサイズの配列を作成する方法がわかりません。これがアイデアでした-

Scanner scanner = new Scanner(System.in);
int target = scanner.nextInt();
boolean [] array_a=new boolean [(target)];

ターゲットがintの範囲を超えると機能しません。助けていただければ幸いです。

更新:みんなありがとう。だから、intの最大範囲(2147483648)のサイズの配列しか作成できませんよね?メモリの側面は以前は私を襲いませんでした。別のアプローチを取るつもりです。

4

5 に答える 5

11

配列インデックスはint。であるため、最大正の値よりも大きいサイズの配列をJavaで作成することはできません。(同じことがさまざまな実装にも当てはまります。たとえば、より多くのエントリを含むものを作成できる場合がありますが、次のようなものは正しく機能しなくなり、 [仮定して]を介して後のエントリを取得することしかできませんでした。ただの休憩]、これにはしばらく時間がかかります。)intListLinkedListgetsizeiterator

boolean2,147,483,647を超えるエントリを収容できる配列を実際に作成する必要はないようですが、実際に作成する場合は、複数の配列を作成し、インデックスの係数を使用して適切な配列を選択する必要があります(になるlong)。(または、JDK以外のライブラリが存在する場合は、それを使用します。)これには4GのRAMが必要です。実現可能ですが、別のアプローチの方が完全に優れている可能性はかなり高いです。

しかし、1,000,000,000,000要素?これには、1〜2TBのRAMが必要です。NPEが言うように、スーパーコンピューターで実行していない場合は、それを実行することはできません。

于 2013-03-26T06:50:30.190 に答える
8

サイズ1000000000000のブール配列を作成する必要があります。私が直面している問題は、入力をintとして格納できないことです。

あなたの問題はそれではありません。主な問題は、1,000,000,000,000要素のデータ構造を割り当てるのに十分なメモリがないことです(intインデックス作成の制限を克服した場合でも)。

アルゴリズムを再考する必要があります。

于 2013-03-26T06:50:09.457 に答える
1

HashMapを使用して、長いキーとブール値を使用するのはどうですか。

そこにはいくつかの利点があります。
1.longの範囲内のインデックスを使用できます
。2。使用されるアイテムインデックスの最大サイズについて心配する必要はありません。長い限り、機能し
ます。3.コレクション全体にメモリを事前に割り当てることはありません。代わりに、必要なメモリのみを使用します。

于 2013-03-26T06:52:24.787 に答える
1

たとえば、配列の配列などの抽象化を作成できます(これを変更することもできます)。

オブジェクト[][]はブール値などです。

class LargeArray {

    private final long size;
    private final int sizeI;
    private final int sizeJ;
    private final Object [][] objects;


    public LargeArray() {
        sizeI = 3;//Any reasonable value;
        sizeJ = Integer.MAX_VALUE;
        objects = new Object [sizeI][sizeJ];
        size = sizeI * sizeJ;
    }

    public long size() {
        return size;
    }

    public Object get(long index) {
         int i = index / sizeJ;
         int j = index % sizeJ;
         return objects[i][j];
    }

    public void set(long index, Object object) {
         int i = index / sizeJ;
         int j = index % sizeJ;
         objects[i][j] = object;
    }
}

最初の次元、たとえば3を変更することもできます。この場合、Object [3] [Integer.MAX_VALUE]では、(2 ^ 31 -1)* 3 = 2,147,483,647 * 3 = 6442450941要素を作成でき、(2 ^ 31 -1)* 3 * 4 =〜23 GB RAM、これは実際に可能です!!! :)

于 2016-03-25T10:52:28.773 に答える
0

まず第一に:あなたは本当にこれだけのメモリを割り当てる正当な理由が必要です。他の人が言っているように、あなたはアプローチを再考したいかもしれません。

いくつかの提案:割り当てる量を最大に制限するか、ファイルに保存してデータを探すか、必要に応じて割り当てます(遅延割り当て)。データがまばらである場合(実際のブール値はほとんどありませんが、インデックスが非常に広く分散している場合)、マップを使用することをお勧めします。主にゼロの場合は、1つだけを保存することを検討してください:)

2番目:ビットをパックすると、理論的には8*最大配列サイズのブール値を割り当てることができます。インスピレーションについては、このディスカッションを参照してください:JavaでのCスタイルのビットフィールドの実装

于 2013-03-26T06:54:50.407 に答える