- ベストアンサー
文字列生成の総当り方法についての質問
- 文字列生成を総当りで行う場合について質問があります。
- 実際の文字列生成処理において、メモリ不足や計算量の問題が発生する可能性があるため、効率的な方法を知りたいです。
- 特に、複数の文生成や生成した文を効率良く使いまわす方法について教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
アルゴリズムなどがわからないわけではなさそうなのでアドバイスだけ・・・ >今のプログラムでは、あらかじめ何個の文ができるか計算してから文を生成しています。 億単位の文字列を生成してから処理するのではメモリが足りなくなるのも無理はありません。使う時に生成すればよいのです。 一応サンプルを書いてみました。 public class Parser { private String[][] elements = null; private int[] index = null; public Parser(String str){ String[] buf = str.split("/"); elements = new String[buf.length][]; for(int i = 0; i < buf.length; i++){elements[i] = buf[i].split(",");} index = new int[buf.length]; for(int i = 0; i < index.length; i++){index[i] = 0;} } public boolean hasNext(){ if(index[0] >= elements[0].length){ return false; } return true; } public String next(){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < index.length; i++){ sb.append(elements[i][index[i]]); if(i < index.length - 1){sb.append("/");} } addIndex(); return sb.toString(); } private void addIndex(){ index[index.length - 1]++; for(int i = index.length - 1; i > 0; i--){ if(index[i] >= elements[i].length){ index[i] = 0; index[i - 1]++; } } } public static void main(String[] args){ Parser p = new Parser("あ,い/うえ/おか,き,くけこ/さ/しす"); while(p.hasNext()){ // ここを任意の処理に置き換える System.out.println(p.next()); } } } このParserというクラスは文字列を生成するための情報だけ持ち、next()というメソッドを呼び出したときに文字列を生成します。 これにより無駄なメモリの消費を押さえることができます。 ※文字列生成のアルゴリズムは条件を満たしてますが適当です。
お礼
素早いお返事ありがとうございます。こちらのプログラムをテストプログラムに載せて走らせましたら、希望通りの動きを得る事ができました。 今から実際の処理に使っている本プログラムに載せて走らせてみます。また何か異常が見つかったら(これが解決されることで新たな問題が浮かび上がるかも…?)宜しくお願いします。