2016-03-19 13 views
0

こんにちは仲間Stackoverflowers。私はJavaの配列で遊んでいて、配列に膨大な量の値を格納しようとしています。しかし、私は配列に一定量以上の値を格納することができませんでした。Java - 配列に大量の値を格納する方法

String data[] = new String[44681003]; //何らかの理由で44681003が醜い赤いエラーメッセージを吐くまで私が行くことができる最高の番号ですコンソール:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

は、私は与えられた文字列リストのすべての順列を生成するプログラムを持っている、と私はその奇妙44680815数よりも多い数を生成する必要がするまで、それは完璧に動作します。 (例:387420489 9^9である)私は値を格納し、forループ内のコンソールにそれをプリントアウトしようとしている

、私は存在するかどうかを疑問に思ったdata[i] = null;

をゼロに戻す値を設定します大量の値を配列に格納する方法ですか?

または単に私の値をプリントアウトして、配列に格納されているからそれを削除することができること

。ここで


私のコードです:コンソールで

public class Permutations { 

public static void main(String[] args) { 
    String database = "abcdefghi"; 

// String data[] = new String[(int) Math.pow(database.length(), database.length())]; 
// ^^ I would like to make it this long, but It gives an error. 

    String data[] = new String[44681003]; 
    StringBuilder temp; 


    for (int i = 0;i<Math.pow(database.length(), database.length());i++){ 
     String base = Integer.toString(i,database.length()); 
     data[i] = base; 
     if (base.length()!=database.length()){ 
      temp = new StringBuilder(""); 
      for (int x = 0;x < (database.length()-data[i].length());x++){ 
       temp.append('0'); 
      } 
      base = temp + base; 

     } 

     for (int y = 0;y<database.length();y++){ 
      base = base.replace((char)('0' + y), database.charAt(y)); 
     } 

     data[i]=null; 

     System.out.println("Pos: " + i + "  " + base); //<-- USE THIS TO WRITE IT OUT 
    }//end big for loop 
    System.out.println("Done"); 



    } 

} 

最終ライン:

Pos: 44680997  badagahcc 
Pos: 44680998  badagahcd 
Pos: 44680999  badagahce 
Pos: 44681000  badagahcf 
Pos: 44681001  badagahcg 
Pos: 44681002  badagahch 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 44681003 
at Permutations.main(Permutations.java:20) 

My computer specs: http://store.asus.com/us/item/201510AM160007799/A17602

  • のWindows 10
  • インテルCore i7の2.6GHzの4720HQ(の3.6GHzまでターボ)
  • 16ギガバイトのメモリ
  • 1TB HDD
  • NVIDIAのGeForce GTX 970M 3ギガバイト
  • 17.3インチIPS FHD(1920× 1080)G-Syncの

をサポートするには、お時間をいただき、ありがとうございます!私は解決策を見つけることができ、多分同じ/同様の質問をした他の人たちを助けることができればと思います!

+1

ヒープ領域のメモリを増やすことができます。それはGoogleです。 –

+0

また、コードを最適化しようとします。 'StringBuilder temp;'はループの外側で宣言できます。 –

+0

@ YassinHajajありがとう、固定:) –

答えて

3

あなたのプログラムはあなたが

data[i] = null; 
つまりあなたは配列に格納した文字列のいずれかを保持しないので、しかし

を行うには、それを求めているものを行うために、より多くのメモリを必要とするのOutOfMemoryErrorを取得している場合

アレイを削除することをお勧めします。これはあなたの記憶上の問題を解決します。

コードを関数に変換すると、後でランダムアクセスが必要な場合でも配列を作成する必要がなくなります。

私はNを得る!あなたが何も手紙を繰り返すことができないのでNのセットからの順列。例えばbadagahccaを3回、cを2回使用しているため、順列ではありません。

public static String generate(String letters, long number) { 
    // get a list of the all the possible characters assuming no duplicates. 
    List<Character> chars = new ArrayList<>(letters.length()); 
    for (int i = 0; i < letters.length(); i++) 
     chars.add(letters.charAt(i)); 
    // start with a string builder. 
    StringBuilder ret = new StringBuilder(letters.length()); 

    // while we have characters left 
    while(chars.length() > 0) { 
     // select one of the unused characters 
     int select = number % chars.length(); 
     // take out the lower portion of the number and use the next portion 
     number /= chars.length(); 
     // Append the N-th character, but remove it so it doesn't get used again. 
     ret.append(chars.remove(select)); 
    } 
    assert number == 0; // otherwise we have not enough letters. 
    return ret; 
} 

このようにして、暗記することなく任意の順列を得ることができます。

+0

お返事ありがとうございます!私のプログラムでは、すべての可能な文字列(文字の繰り返しを含む)を生成したいと思います。私は順列と組み合わせと混同していると思う。私のために、私はbadagahccを生成したいと思います。私は配列を削除して、常に上書きされる文字列で置き換えようとします。 –

+0

@ JoshuaLochnerあなたは上書きされるStringBuilderを使うことができますが、最も簡単な解決法は再帰を使うことです。注:コンソールがあまり速くないと仮定すると、それらをすべて印刷するのに非常に時間がかかることがあります。 –

+0

再帰を意味するときに詳しく教えてください。 (申し訳ありませんが、私はこのxDのようなものですばらしいはずがありません)...私は正常に配列を削除して、今は絶えず上書きされる1つの文字列を使用しています。私は実際にコンソールに印刷中です!それは非常に遅いです!今1300万。 (13/44) –

関連する問題