初めての質問で分かりにくいところもあるかと思いますが宜しくお願いします。
あ,い/うえ/おか,き,くけこ/さ/しす
という文字列から、
あ/うえ/おか/さ/しす
あ/うえ/き/さ/しす
あ/うえ/くけこ/さ/しす
い/うえ/おか/さ/しす
い/うえ/き/さ/しす
い/うえ/くけこ/さ/しす
このような文章を作りたいのです。
言葉で説明しにくいのですが、"/"と"/"の間にある文字列を必ず1つ使い、","があるところを総当りで文字列を生成します。
私の作ったプログラムでは、この例のように6文で済む場合なら対応できるのですが、実際に使う文章はもっと長く、"/"の区切りも多く、更に"."が10個以上あることも多いので、文が億単位で生成されることも多々あります。intで表せない(今のプログラムでは、あらかじめ何個の文ができるか計算してから文を生成しています。)場合や、文字列を格納する場所が多くなりすぎてメモリが足りなくなり、生成できません。
この文字列生成は、上記の6個ように総当りで文字列が生成できれば、どの文が最初に生成されても構いません。できれば1文出来るごとにそれを使った違う処理に移り、返ってきたらその文を捨ててまた新たな文を生成できると嬉しいです。
どうぞ宜しくお願いします。
No.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()というメソッドを呼び出したときに文字列を生成します。
これにより無駄なメモリの消費を押さえることができます。
※文字列生成のアルゴリズムは条件を満たしてますが適当です。
素早いお返事ありがとうございます。こちらのプログラムをテストプログラムに載せて走らせましたら、希望通りの動きを得る事ができました。
今から実際の処理に使っている本プログラムに載せて走らせてみます。また何か異常が見つかったら(これが解決されることで新たな問題が浮かび上がるかも…?)宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- 計算機科学 急ぎです、大学数学再帰の問題難しくてがわからないです。 以下の4つの文字列を連結して新たに生成できる 1 2023/05/17 20:11
- オープンソース 【ChatGTPのオープンソースソフトウェアを解析したことがある方、教えてくださ 2 2023/03/08 18:57
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- その他(パソコン・周辺機器) チャットGDPでAIが回答中に固まったらどうすればいいですか? 4 2023/05/19 16:31
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Java Java 南京錠 2 2023/02/04 11:46
- Perl perlについての質問 2 2022/10/17 15:25
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaのCSVデータ読込についてです
-
DateTimePickerに値を入れたい...
-
このプログラミング誰か教えて...
-
ArrayListの要素数の上限
-
JavaScript内で得た値をVBScrip...
-
バイト配列からfloat型の数値を...
-
wsprintf関数の使い方について
-
DOSバッチで変数の値を変数名に...
-
JavaScript→HTMLへ値渡しする方法
-
byte配列→float型の値を読みlon...
-
C言語の変数(LSB)の合わせ込...
-
PSQLExceptionが発生する
-
matchesを否定文として使う方法...
-
BCD形式で時刻を!
-
Stringクラスの変数の格納アド...
-
ダブルクォーテーションを含む...
-
Evaluate()に文字列の形式の数...
-
char型での演算子
-
javaで質問です。 文字列2023/2...
-
[JAVA]try 内の変数を外で!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
wsprintf関数の使い方について
-
javaのCSVデータ読込についてです
-
ArrayListの要素数の上限
-
特定の文字列を複数抜き出した...
-
Stringクラスの変数の格納アド...
-
結合した文字列をファイル名に...
-
BCD形式で時刻を!
-
DateTimePickerに値を入れたい...
-
Evaluate()に文字列の形式の数...
-
実行シェルからCOBOLへパラメー...
-
hiddenの値を消したくない!
-
DOSバッチで変数の値を変数名に...
-
C言語の変数(LSB)の合わせ込...
-
excel vba 時間計算と条件分岐...
-
Javaの問題なのですが、「3文字...
-
matchesを否定文として使う方法...
-
JSPでの計算結果表示
-
8桁整数を限りなく短い文字列に...
-
指定した日付が何日前なのかを...
おすすめ情報