質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

Q&A

解決済

5回答

943閲覧

入力された文を、母音が一緒の文字に入れ替えたい

777_superlucky

総合スコア7

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

0グッド

1クリップ

投稿2020/03/16 06:05

前提・実現したいこと

今 個人で使うためにJavaで入力された文の文字を、同じ母音の文字に入れ替え、文を表示するプログラムを組んでいます。
1 文を入力
2 文に含まれている文字の母音を調べる
3 1の文に含まれている文字を同じ母音を持つ文字へ入れ替える
4 表示
の流れで処理を行うプログラムで、処理結果は表示されるまではいったのですが、3のところで同じ母音を持たない文字への入れ替えが行われてしまいます。
3の部分でのコードで問題が起きていると思うのですが、直し方がわからず質問しました。

発生している問題・エラーメッセージ

入れ替えたい段では無い文字でも、入れ替えが行われてしまう
例 う段の文字で入れ替えをしたいが、お段の文字でも入れ替えが起きている

該当のソースコード

Java

1import java.io.*; 2import java.util.*; 3import java.io.FileWriter; 4import java.io.BufferedWriter; 5 6public class ShinIrekae{ 7 public static void main(String[] args) throws IOException{ 8 final BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 9 10 System.out.println("どのような文の子音を変えますか?"); 11 String moto = buf.readLine(); 12 int motoline = moto.length(); 13 StringBuffer moto2 = new StringBuffer(moto); 14 char[] Moto = moto.toCharArray(); 15 Hikaku(Moto); 16 mk(moto,motoline, "", Moto); 17 } 18 19 private static void Hikaku(final char[] MOto){ 20 for(int b=0; b<MOto.length; b++){ 21 for(int a=0; a<A.length; a++){ 22 if((MOto[b]) == (A[a])){ 23 System.out.println(MOto[b] + "は、あ段にあります"); 24 } 25 } 26 for(int i=0; i<I.length; i++){ 27 if((MOto[b]) == (I[i])){ 28 System.out.println(MOto[b] + "は、い段にあります"); 29 } 30 } 31 for(int u=0; u<U.length; u++){ 32 if((MOto[b]) == (U[u])){ 33 System.out.println(MOto[b] + "は、う段にあります"); 34 } 35 } 36 for(int e=0; e<E.length; e++){ 37 if((MOto[b]) == (E[e])){ 38 System.out.println(MOto[b] + "は、え段にあります"); 39 } 40 } 41 for(int o=0; o<O.length; o++){ 42 if((MOto[b]) == (O[o])){ 43 System.out.println(MOto[b] + "は、お段にあります"); 44 } 45 } 46 for(int n=0; n<N.length; n++){ 47 if((MOto[b]) == (N[n])){ 48 System.out.println(MOto[b] + "は、んです");; 49 } 50 } 51 } 52 } 53 54 private static void mk(final String MOTO, final int size, final String text, final char[] chmoto){ 55 FileWriter fw = null; 56 BufferedWriter bw = null; 57 int cMT = MOTO.length(); 58 char[] chMOTO = new char [cMT]; 59 char[] chMOTOhi = new char [cMT]; 60 for(int kakuMOTO = 0; kakuMOTO<cMT; kakuMOTO++){ 61 chMOTO[kakuMOTO] = MOTO.charAt(kakuMOTO); 62 chMOTOhi[kakuMOTO] = chMOTO[kakuMOTO]; 63 } 64 char[] chMOTOhi2 = new char [cMT]; 65 for(int z=0; z<cMT; z++){ 66 for(int aa=0; aa<A.length; aa++){ 67 if((chMOTO[z]) == (A[aa])){ 68 chMOTOhi2[z] = 'あ'; 69 } 70 } 71 for(int ii=0; ii<I.length; ii++){ 72 if((chMOTO[z]) == (I[ii])){ 73 chMOTOhi2[z] = 'い'; 74 } 75 } 76 for(int uu=0; uu<U.length; uu++){ 77 if((chMOTO[z]) == (U[uu])){ 78 chMOTOhi2[z] = 'う'; 79 } 80 } 81 for(int ee=0; ee<E.length; ee++){ 82 if((chMOTO[z]) == (E[ee])){ 83 chMOTOhi2[z] = 'え'; 84 } 85 } 86 for(int oo=0; oo<O.length; oo++){ 87 if((chMOTO[z]) == (O[oo])){ 88 chMOTOhi2[z] = 'お'; 89 } 90 } 91 for(int nn=0; nn<N.length; nn++){ 92 if((chMOTO[z]) == (N[nn])){ 93 chMOTOhi2[z] = 'ん'; 94 } 95 } 96 } 97 98 int cht = text.length(); 99 char[] chtext = new char [cht]; 100 char[] chtexthi = new char [cht]; 101 for(int kakutext = 0; kakutext<cht; kakutext++){ 102 chtext[kakutext] = text.charAt(kakutext); 103 chtexthi[kakutext] = chtext[kakutext]; 104 } 105 char[] chtexthi2 = new char [cht]; 106 for(int zz=0; zz<text.length(); zz++){ 107 for(int aaa=0; aaa<A.length; aaa++){ 108 if((chtext[zz]) == (A[aaa])){ 109 chtexthi2[zz] = 'あ'; 110 } 111 }for(int iii=0; iii<I.length; iii++){ 112 if((chtext[zz]) == (I[iii])){ 113 chtexthi2[zz] = 'い'; 114 } 115 } 116 for(int uuu=0; uuu<U.length; uuu++){ 117 if((chtext[zz]) == (U[uuu])){ 118 chtexthi2[zz] = 'う'; 119 } 120 } 121 for(int eee=0; eee<E.length; eee++){ 122 if((chtext[zz]) == (E[eee])){ 123 chtexthi2[zz] = 'え'; 124 } 125 } 126 for(int ooo=0; ooo<O.length; ooo++){ 127 if((chtext[zz]) == (O[ooo])){ 128 chtexthi2[zz] = 'お'; 129 } 130 } 131 for(int nnn=0; nnn<N.length; nnn++){ 132 if((chtext[zz]) == (N[nnn])){ 133 chtexthi2[zz] = 'ん'; 134 } 135 } 136 } 137 138 if(text.length() == size){ 139 for(int zzz=0; zzz<cht; zzz++){ 140 if(chMOTOhi2[zzz] == chtexthi2[zzz]){ 141 try{ 142 String bun = "ShinIrekae.txt"; 143 fw = new FileWriter(bun, true); 144 bw = new BufferedWriter(fw); 145 bw.write(text); 146 System.out.println(text); 147 bw.newLine(); 148 bw.close(); 149 }catch(IOException ex){ 150 } 151 } 152 return; 153 } 154 }else{ 155 for(int c=0; c<cMT; c++){ 156 if(chMOTOhi2[c] == 'あ'){ 157 for(char d : A){ 158 mk(MOTO, size, text + d, chmoto); 159 } 160 }else if(chMOTOhi2[c] == 'い'){ 161 for(char d : I){ 162 mk(MOTO, size, text + d, chmoto); 163 } 164 }else if(chMOTOhi2[c] == 'う'){ 165 for(char d : U){ 166 mk(MOTO, size, text + d, chmoto); 167 } 168 }else if(chMOTOhi2[c] == 'え'){ 169 for(char d : E){ 170 mk(MOTO, size, text + d, chmoto); 171 } 172 }else if(chMOTOhi2[c] == 'お'){ 173 for(char d : O){ 174 mk(MOTO, size, text + d, chmoto); 175 } 176 }else if(chMOTOhi2[c] == 'ん'){ 177 for(char d : N){ 178 mk(MOTO, size, text + d, chmoto); 179 } 180 } 181 } 182 } 183 } 184 185 private static char[] A = {'あ','ぁ','か','が','さ','ざ','た','だ','な','は','ば','ぱ','ま','や','ゃ','ら','わ'}; 186 private static char[] I = {'い','ぃ','き','ぎ','し','じ','ち','ぢ','に','ひ','び','ぴ','み','り','ゐ'}; 187 private static char[] U = {'う','ぅ','く','ぐ','す','ず','つ','づ','ぬ','ふ','ぶ','ぷ','む','ゆ','ゅ','る'}; 188 private static char[] E = {'え','ぇ','け','げ','せ','ぜ','て','で','ね','へ','べ','ぺ','め','れ','ゑ'}; 189 private static char[] O = {'お','ぉ','こ','ご','そ','ぞ','と','ど','の','ほ','ぼ','ぽ','も','よ','ょ','ろ'}; 190 private static char[] N = {'ん'}; 191 private static char[] Hiragana = {'あ','い','う','え','お','か','が','き','ぎ','く','ぐ','け','げ','こ','ご','さ','ざ','し','じ','す','ず','せ','ぜ','そ','ぞ','た','だ','ち','ぢ','つ','づ','て','で','と','ど','な','に','ぬ','ね','の','は','ば','ぱ','ひ','び','ぴ','ふ','ぶ','ぷ','へ','べ','ぺ','ほ','ぼ','ぽ','ま','み','む','め','も','や','ゃ','ゆ','ゅ','よ','ょ','ら','り','る','れ','ろ','わ','を','ん'}; 192}

補足情報(FW/ツールのバージョンなど)

「よる」と打ち込んだ場合の実行結果

Java

1おお 2おぉ 3おこ 4おご 5おそ 6おぞ 7おと 8おど 9おの 10おほ 11おぼ 12おぽ 13おも 14およ 15おょ 16おろ 17おう 18おぅ 19おく 20おぐ 21おす 22おず 23おつ 24おづ 25おぬ 26おふ 27おぶ 28おぷ 29おむ 30おゆ 31おゅ 32おる 33ぉお 34ぉぉ 35ぉこ 36ぉご 37ぉそ 38ぉぞ 39ぉと 40ぉど 41ぉの 42ぉほ 43ぉぼ 44ぉぽ 45ぉも 46ぉよ 47ぉょ 48ぉろ 49ぉう 50ぉぅ 51ぉく 52ぉぐ 53ぉす 54ぉず 55ぉつ 56ぉづ 57ぉぬ 58ぉふ 59ぉぶ 60ぉぷ 61ぉむ 62ぉゆ 63ぉゅ 64ぉる 65こお 66こぉ 67ここ 68こご 69こそ 70こぞ 71こと 72こど 73この 74こほ 75こぼ 76こぽ 77こも 78こよ 79こょ 80ころ 81こう 82こぅ 83こく 84こぐ 85こす 86こず 87こつ 88こづ 89こぬ 90こふ 91こぶ 92こぷ 93こむ 94こゆ 95こゅ 96こる 97ごお 98ごぉ 99ごこ 100ごご 101ごそ 102ごぞ 103ごと 104ごど 105ごの 106ごほ 107ごぼ 108ごぽ 109ごも 110ごよ 111ごょ 112ごろ 113ごう 114ごぅ 115ごく 116ごぐ 117ごす 118ごず 119ごつ 120ごづ 121ごぬ 122ごふ 123ごぶ 124ごぷ 125ごむ 126ごゆ 127ごゅ 128ごる 129そお 130そぉ 131そこ 132そご 133そそ 134そぞ 135そと 136そど 137その 138そほ 139そぼ 140そぽ 141そも 142そよ 143そょ 144そろ 145そう 146そぅ 147そく 148そぐ 149そす 150そず 151そつ 152そづ 153そぬ 154そふ 155そぶ 156そぷ 157そむ 158そゆ 159そゅ 160そる 161ぞお 162ぞぉ 163ぞこ 164ぞご 165ぞそ 166ぞぞ 167ぞと 168ぞど 169ぞの 170ぞほ 171ぞぼ 172ぞぽ 173ぞも 174ぞよ 175ぞょ 176ぞろ 177ぞう 178ぞぅ 179ぞく 180ぞぐ 181ぞす 182ぞず 183ぞつ 184ぞづ 185ぞぬ 186ぞふ 187ぞぶ 188ぞぷ 189ぞむ 190ぞゆ 191ぞゅ 192ぞる 193とお 194とぉ 195とこ 196とご 197とそ 198とぞ 199とと 200とど 201との 202とほ 203とぼ 204とぽ 205とも 206とよ 207とょ 208とろ 209とう 210とぅ 211とく 212とぐ 213とす 214とず 215とつ 216とづ 217とぬ 218とふ 219とぶ 220とぷ 221とむ 222とゆ 223とゅ 224とる 225どお 226どぉ 227どこ 228どご 229どそ 230どぞ 231どと 232どど 233どの 234どほ 235どぼ 236どぽ 237ども 238どよ 239どょ 240どろ 241どう 242どぅ 243どく 244どぐ 245どす 246どず 247どつ 248どづ 249どぬ 250どふ 251どぶ 252どぷ 253どむ 254どゆ 255どゅ 256どる 257のお 258のぉ 259のこ 260のご 261のそ 262のぞ 263のと 264のど 265のの 266のほ 267のぼ 268のぽ 269のも 270のよ 271のょ 272のろ 273のう 274のぅ 275のく 276のぐ 277のす 278のず 279のつ 280のづ 281のぬ 282のふ 283のぶ 284のぷ 285のむ 286のゆ 287のゅ 288のる 289ほお 290ほぉ 291ほこ 292ほご 293ほそ 294ほぞ 295ほと 296ほど 297ほの 298ほほ 299ほぼ 300ほぽ 301ほも 302ほよ 303ほょ 304ほろ 305ほう 306ほぅ 307ほく 308ほぐ 309ほす 310ほず 311ほつ 312ほづ 313ほぬ 314ほふ 315ほぶ 316ほぷ 317ほむ 318ほゆ 319ほゅ 320ほる 321ぼお 322ぼぉ 323ぼこ 324ぼご 325ぼそ 326ぼぞ 327ぼと 328ぼど 329ぼの 330ぼほ 331ぼぼ 332ぼぽ 333ぼも 334ぼよ 335ぼょ 336ぼろ 337ぼう 338ぼぅ 339ぼく 340ぼぐ 341ぼす 342ぼず 343ぼつ 344ぼづ 345ぼぬ 346ぼふ 347ぼぶ 348ぼぷ 349ぼむ 350ぼゆ 351ぼゅ 352ぼる 353ぽお 354ぽぉ 355ぽこ 356ぽご 357ぽそ 358ぽぞ 359ぽと 360ぽど 361ぽの 362ぽほ 363ぽぼ 364ぽぽ 365ぽも 366ぽよ 367ぽょ 368ぽろ 369ぽう 370ぽぅ 371ぽく 372ぽぐ 373ぽす 374ぽず 375ぽつ 376ぽづ 377ぽぬ 378ぽふ 379ぽぶ 380ぽぷ 381ぽむ 382ぽゆ 383ぽゅ 384ぽる 385もお 386もぉ 387もこ 388もご 389もそ 390もぞ 391もと 392もど 393もの 394もほ 395もぼ 396もぽ 397もも 398もよ 399もょ 400もろ 401もう 402もぅ 403もく 404もぐ 405もす 406もず 407もつ 408もづ 409もぬ 410もふ 411もぶ 412もぷ 413もむ 414もゆ 415もゅ 416もる 417よお 418よぉ 419よこ 420よご 421よそ 422よぞ 423よと 424よど 425よの 426よほ 427よぼ 428よぽ 429よも 430よよ 431よょ 432よろ 433よう 434よぅ 435よく 436よぐ 437よす 438よず 439よつ 440よづ 441よぬ 442よふ 443よぶ 444よぷ 445よむ 446よゆ 447よゅ 448よる 449ょお 450ょぉ 451ょこ 452ょご 453ょそ 454ょぞ 455ょと 456ょど 457ょの 458ょほ 459ょぼ 460ょぽ 461ょも 462ょよ 463ょょ 464ょろ 465ょう 466ょぅ 467ょく 468ょぐ 469ょす 470ょず 471ょつ 472ょづ 473ょぬ 474ょふ 475ょぶ 476ょぷ 477ょむ 478ょゆ 479ょゅ 480ょる 481ろお 482ろぉ 483ろこ 484ろご 485ろそ 486ろぞ 487ろと 488ろど 489ろの 490ろほ 491ろぼ 492ろぽ 493ろも 494ろよ 495ろょ 496ろろ 497ろう 498ろぅ 499ろく 500ろぐ 501ろす 502ろず 503ろつ 504ろづ 505ろぬ 506ろふ 507ろぶ 508ろぷ 509ろむ 510ろゆ 511ろゅ 512ろる

「よる」と打ち込んだ場合、1文字目はお段 2文字目はう段の文字で入れ替えをしたいのですが、処理を行うと、1文字目はお段 2文字目はお段とう段の文字で入れ替えが起きています。

VirtualBoxでCentOS7を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/03/16 09:14

OS や環境に依存する内容で無ければ CentOS や VertualBox のタグは不要です.
777_superlucky

2020/03/17 03:10

ありがとうございます。 まだ質問に慣れていないので今後からは気を付けます。
guest

回答5

0

多分ですけど、2文字目だけが入れ替えが多いんではなく、1文字目もお段とう段両方で入れ替えされているけれど、if(chMOTOhi2[zzz] == chtexthi2[zzz]){(初回でreturnするため実質if(chMOTOhi2[0] == chtexthi2[0]){)で1文字目だけはお段以外はファイル出力していないという状況だと思います。

for(int c=0; c<cMT; c++){のforを削除、代わりにint c = text.length();とすれば変わると思います。

ただ、全体的に無駄なif、for文が多い印象です。1文字ずつ再帰するならforはAIUEON配列の列挙以外は必要ない気がします。プログラムを書く前に、フローチャート等で整理するとスッキリするかもしれません。
とりあえず、インデントはしっかりしたほうが良いと思います。

投稿2020/03/16 08:05

moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

777_superlucky

2020/03/17 03:11

回答ありがとうございます。 色々と試していたので、for文など無駄が多くなってしまいました。 インデントを直すのを忘れていたので、気を付けます。
guest

0

こんなやりかたもあります。

Java

1import java.util.Scanner; 2 3public class ShinIrekae { 4 final String[] aiueo = { 5 "あぁかがさざただなはばぱまやゃらわ", "いぃきぎしじちぢにひびぴみりゐ", 6 "うぅくぐすずつづぬふぶぷむゆゅる", "えぇけげせぜてでねへべぺめれゑ", 7 "おぉこごそぞとどのほぼぽもよょろ", "ん" 8 }; 9 String str; char ca[]; 10 11 public static void main(String[] args) { new ShinIrekae(); } 12 13 ShinIrekae() { 14 Scanner scn = new Scanner(System.in); 15 System.out.println("どのような文の子音を変えますか?"); 16 str = scn.nextLine(); 17 for (int i = 0; i < str.length(); i++) { 18 int j = getDan(str.charAt(i)); 19 if (j == 5) System.out.println("んは、んです"); 20 else if (j >= 0) System.out.println(str.charAt(i) + "は、" 21 + aiueo[j].charAt(0) + "段にあります"); 22 } 23 ca = new char[str.length()]; 24 gen(0); 25 } 26 27 int getDan(char c) { 28 for (int i = 0; i < aiueo.length; i++) 29 if (aiueo[i].indexOf(c) >= 0) return i; 30 return -1; 31 } 32 33 void gen(int n) { 34 if (n == str.length()) System.out.println(ca); 35 else { 36 int j = getDan(str.charAt(n)), k = aiueo[j].length(); 37 for (int i = 0; i < k; i++) { ca[n] = aiueo[j].charAt(i); gen(n+1); } 38 } 39 } 40}

追記
再帰呼出しを使わないと、

Java

1import java.util.Scanner; 2 3public class ShinIrekae { 4 final static String[] aiueo = { 5 "あぁかがさざただなはばぱまやゃらわ", "いぃきぎしじちぢにひびぴみりゐ", 6 "うぅくぐすずつづぬふぶぷむゆゅる", "えぇけげせぜてでねへべぺめれゑ", 7 "おぉこごそぞとどのほぼぽもよょろ" 8 }; 9 10 public static void main(String[] args) { 11 Scanner scn = new Scanner(System.in); 12 System.out.println("どのような文の子音を変えますか?"); 13 String str = scn.nextLine(); 14 int i, j, len = str.length(), dan[] = new int[len], pos[] = new int[len]; 15 for (i = 0; i < str.length(); dan[i++] = j) { 16 char c = str.charAt(i); 17 if ((j = getDan(c)) < 0) System.out.println(c + "は、そのものです"); 18 else System.out.println(c + "は、" + aiueo[j].charAt(0) + "段にあります"); 19 } 20 do { 21 for (i = 0; i < len; i++) 22 if (dan[i] < 0) System.out.print(str.charAt(i)); 23 else System.out.print(aiueo[dan[i]].charAt(pos[i])); 24 System.out.println(); 25 for (i = len; --i >= 0; pos[i] = 0) 26 if ((j = dan[i]) >= 0 && ++pos[i] < aiueo[j].length()) break; 27 } while (i >= 0); 28 } 29 30 static int getDan(char c) { 31 for (int i = 0; i < aiueo.length; i++) 32 if (aiueo[i].indexOf(c) >= 0) return i; 33 return -1; 34 } 35}

投稿2020/03/17 10:50

編集2020/03/18 02:43
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

777_superlucky

2020/03/18 05:59

回答ありがとうございます。 色々なやり方を知ることが出来てうれしいです。
kazuma-s

2020/03/18 06:15

知ることができたというのは、理解できたということでしょうか? どこが分からないのかを質問していただけるほうが、私はうれしいのですが。
guest

0

元のソースをなるべくいかしつつ。

このプログラムの仕様が段の集合の直積をとるのなら、次のように処理します。

  • 段のリストを作成する。List(段、段、...)
  • リストに含まれる段の直積をとる。段 X 段 X ...
  • 必要なら直積から元の文字列を削除する

java

1 public static void main(String[] args) throws IOException { 2 3 final BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 4 5 System.out.println("どのような文の子音を変えますか?"); 6 String moto = buf.readLine(); 7 8 char[][] boin = Hikaku(moto.toCharArray()); // よる → {O, U} にする 9 10 mk("", moto.length(), boin); 11 } 12 13 // boin 配列の組み合わせを表示する。 14 private static void mk(final String prefix, final int size, final char[][] boin) { 15 if(boin.length == 0) return; 16 17 int nMojime = prefix.length(); 18 for (char c : boin[nMojime]) { 19 if(nMojime + 1 == size) { 20 System.out.println(prefix + c); // "前の文字" + 母音 を表示(文末の母音をループで表示) 21 } else { 22 mk(prefix + c, size, boin); // 最後の文字でない場合、いまある母音を引数に、次の文字をループで表示。 23 } 24 } 25 } 26 27 private static char[][] Hikaku(final char[] moji) { 28 char[][] ret = new char[moji.length][]; 29 30 for(int i = 0; i < moji.length; i++ ) { 31 // 文字毎に対応する五十音の段を取得する 32 ret[i] = find(moji[i]); 33 } 34 35 return ret; 36 } 37 38 // 文字種配列から、当該の文字を含む段を探す 39 private static char[] find(char c) { 40 // あ段、い段、う段... に、文字があれば、その段の配列を返す。 41 for(int i = 0; i < Hiragana.length; i++) { 42 for(int j = 0; j < Hiragana[i].length; j++) { 43 if(c == Hiragana[i][j]) { 44 System.out.println(c + "は、" + Hiragana[i][0] + (Hiragana[i][0] != 'ん' ? "段にあります" : "です")); 45 return Hiragana[i]; 46 } 47 } 48 } 49 // ひらがなが入力されていない(見つからない)場合 50 System.out.println("ひらがなで入力してください:" + c); 51 return new char[0]; 52 } 53 54 private static char[] A = { 'あ', 'ぁ', 'か', 'が', 'さ', 'ざ', 'た', 'だ', 'な', 'は', 'ば', 'ぱ', 'ま', 'や', 'ゃ', 'ら', 'わ' }; 55 private static char[] I = { 'い', 'ぃ', 'き', 'ぎ', 'し', 'じ', 'ち', 'ぢ', 'に', 'ひ', 'び', 'ぴ', 'み', 'り', 'ゐ' }; 56 private static char[] U = { 'う', 'ぅ', 'く', 'ぐ', 'す', 'ず', 'つ', 'づ', 'ぬ', 'ふ', 'ぶ', 'ぷ', 'む', 'ゆ', 'ゅ', 'る' }; 57 private static char[] E = { 'え', 'ぇ', 'け', 'げ', 'せ', 'ぜ', 'て', 'で', 'ね', 'へ', 'べ', 'ぺ', 'め', 'れ', 'ゑ' }; 58 private static char[] O = { 'お', 'ぉ', 'こ', 'ご', 'そ', 'ぞ', 'と', 'ど', 'の', 'ほ', 'ぼ', 'ぽ', 'も', 'よ', 'ょ', 'ろ' }; 59 private static char[] N = { 'ん' }; 60 private static char[][] Hiragana = {A, I, U, E, O, N}; 61 62} 63

投稿2020/03/17 04:13

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

777_superlucky

2020/03/17 06:36

回答ありがとうございます。 自分が書いていたコードを生かしてくださった上に、綺麗にまとめられていてありがたいです。
guest

0

別解

このプログラムの仕様が段の集合の直積をとるのなら、次のように処理します。

  • 段のリストを作成する。List(段、段、...)
  • リストに含まれる段の直積をとる。段 X 段 X ...
  • 必要なら直積から元の文字列を削除する

段のリストを作成する。List(段、段、...)

入力された文字列の1文字ごとに段を特定しリストに追加する。

Java

1static List<List<Character>> findLines(final String source) { 2 return source.chars().collect( 3 ArrayList::new, 4 (acc, target) -> { 5 allLines.stream().anyMatch( 6 line -> { 7 if (line.stream().anyMatch(c -> target == c)) { 8 char fc = line.get(0); 9 System.out.println((char)target + "は、"+fc+((fc=='ん')?"":"段")+"にあります"); 10 return acc.add(line); 11 } else {return false;} 12 }); 13 }, List::addAll); 14} 15 16static final List<Character> A = Arrays.asList('あ', 'ぁ', 'か', 'が', 'さ', 'ざ', 'た', 'だ', 'な', 'は', 'ば', 'ぱ', 'ま', 'や', 'ゃ', 'ら', 'わ'); 17static final List<Character> I = Arrays.asList('い', 'ぃ', 'き', 'ぎ', 'し', 'じ', 'ち', 'ぢ', 'に', 'ひ', 'び', 'ぴ', 'み', 'り', 'ゐ'); 18static final List<Character> U = Arrays.asList('う', 'ぅ', 'く', 'ぐ', 'す', 'ず', 'つ', 'づ', 'ぬ', 'ふ', 'ぶ', 'ぷ', 'む', 'ゆ', 'ゅ', 'る'); 19static final List<Character> E = Arrays.asList('え', 'ぇ', 'け', 'げ', 'せ', 'ぜ', 'て', 'で', 'ね', 'へ', 'べ', 'ぺ', 'め', 'れ', 'ゑ'); 20static final List<Character> O = Arrays.asList('お', 'ぉ', 'こ', 'ご', 'そ', 'ぞ', 'と', 'ど', 'の', 'ほ', 'ぼ', 'ぽ', 'も', 'よ', 'ょ', 'ろ'); 21static final List<Character> N = Arrays.asList('ん'); 22static final List<List<Character>> allLines = Arrays.asList(A,I,U,E,O,N);

リストに含まれる段の直積をとる。段 X 段 X ...

段に含まれる文字のすべての組みあわせを作る。

Java

1static List<List<Character>> product(List<List<Character>> lines, int idx, List<List<Character>> buff) { 2 if (idx == lines.size()) { 3 return buff; 4 } 5 List<Character> line = lines.get(idx); 6 List<List<Character>> accumulator = (idx == 0) 7 ? line.stream() 8 .collect( 9 ArrayList::new, 10 (acc, c) -> acc.add(Arrays.asList(c)), 11 List::addAll) 12 : buff.stream() 13 .flatMap(b -> line.stream().map(c -> Stream.concat(b.stream(),Stream.of(c)).collect(Collectors.toList()))) 14 .collect(Collectors.toList()); 15 return product(lines, idx + 1, accumulator); 16}

文字の集合を文字列に変換する

List<List<Character>>をList<String>に変換

Java

1static List<String> differentConsonants(final String source) { 2 List<List<Character>> result = product(findLines(source), 0, new ArrayList<>()); 3 return result.stream() 4 .map(l -> l.stream().map(String::valueOf).collect(Collectors.joining())) 5 .filter(s -> !s.equals(source)) // 元の文字列は除外 6 .collect(Collectors.toList()); 7}

投稿2020/03/16 13:48

編集2020/03/17 14:35
xebme

総合スコア1090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

777_superlucky

2020/03/17 03:14

回答ありがとうございます。 部分ごと書かれていてとても見やすかったです。
xebme

2020/03/17 03:42

直積処理の一部をStream.concat()を利用するよう修正しました。
guest

0

ベストアンサー

数値のカウントアップが桁上がりで各桁が変化していくように, 文字を桁上がりさせる構造を作れば, 再帰は必要ありません.

java

1import java.io.*; 2import java.util.*; 3 4public class ShinIrekae{ 5 public static void main(String[] args) throws IOException{ 6 try(BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));) { 7 System.out.println("どのような文の子音を変えますか?"); 8 String moto = buf.readLine(); 9 10 CharsRow charsRow = new CharsRow(); 11 charsRow.check(moto); 12 13 StringCounter stringCounter = new StringCounter(moto, charsRow); 14 try (PrintStream out = new PrintStream("ShinIrekae.txt");) { 15 do { 16 System.out.println(stringCounter); 17 out.println(stringCounter); 18 } while(stringCounter.countUp()); 19 } 20 } 21 } 22} 23 24interface CarryOverListener { 25 void carryOver(); 26} 27 28/** 29 * chars の各文字を循環出力する. 30 * countUp() で次の文字に移動し, 最後の文字の後は先頭の文字に戻る. 31 * この時, 登録されていれば CarryOverListener#carryOver() を呼び出す. 32 */ 33class CharCounter implements CarryOverListener { 34 private CarryOverListener listener; 35 private char[] chars; 36 private int index; 37 CharCounter(char[] chars, CarryOverListener listener) { 38 this.chars = chars; 39 this.listener = listener; 40 } 41 void countUp() { 42 if(++index >= chars.length) { 43 index = 0; 44 if(listener != null) listener.carryOver(); 45 } 46 } 47 char get() { return chars[index]; } 48 @Override 49 public void carryOver() { countUp(); } 50} 51 52class StringCounter implements CarryOverListener { 53 private List<CharCounter> ccList; 54 private boolean carry; 55 StringCounter(String moto, CharsRow charsRow) { 56 ccList = new ArrayList<>(); 57 CarryOverListener prev = this; 58 for(char c : moto.toCharArray()){ 59 CharCounter cc = new CharCounter(charsRow.get(c), prev); 60 ccList.add(cc); 61 prev = cc; 62 } 63 } 64 /** 65 * 最下位桁をカウントアップ 66 * @return 処理後も有効値なら true (最上位桁でキャリーオーバーが発生したら false) 67 */ 68 boolean countUp() { 69 if(!carry) ccList.get(ccList.size()-1).countUp(); 70 return !carry; 71 } 72 boolean isCarryOver() { return carry; } 73 @Override 74 public void carryOver() { carry = true; } 75 @Override 76 public String toString() { 77 StringBuilder sb = new StringBuilder(); 78 for(CharCounter cc : ccList) sb.append(cc.get()); 79 return sb.toString(); 80 } 81} 82 83class CharsRow { 84 private static String[] ROWS = { 85 "あぁかがさざただなはばぱまやゃらわ", 86 "いぃきぎしじちぢにひびぴみりゐ", 87 "うぅくぐすずつづぬふぶぷむゆゅる", 88 "えぇけげせぜてでねへべぺめれゑ", 89 "おぉこごそぞとどのほぼぽもよょろ", 90 }; 91 private Map<Character,char[]> cache = new HashMap<>(); 92 void check(String moto) { 93 for(char c : moto.toCharArray()){ 94 char[] r = get(c); 95 System.out.println(c + "は、" + r[0] + (r.length>=2?"段にあります":"です")); 96 } 97 } 98 char[] get(char c) { 99 for(String r : ROWS) { 100 if(r.indexOf(c) >= 0) { 101 char[] a = cache.get(r.charAt(0)); 102 if(a == null) { 103 a = r.toCharArray(); 104 cache.put(r.charAt(0), a); 105 } 106 return a; 107 } 108 } 109 char[] a = cache.get(c); 110 if(a == null) { 111 a = new char[]{c}; 112 cache.put(c, a); 113 } 114 return a; 115 } 116}

plain

1どのような文の子音を変えますか? 2よる 3よは、お段にあります 4るは、う段にあります 5おう 6おぅ 7おく 8おぐ 9おす 10おず 11おつ 12おづ 13おぬ 14おふ 15おぶ 16おぷ 17おむ 18おゆ 19おゅ 20おる 21ぉう 22ぉぅ 23ぉく 24ぉぐ 25ぉす 26ぉず 27ぉつ 28ぉづ 29ぉぬ 30ぉふ 31ぉぶ 32ぉぷ 33ぉむ 34ぉゆ 35ぉゅ 36ぉる 37こう 38こぅ 39こく 40こぐ 41こす 42こず 43こつ 44こづ 45こぬ 46こふ 47こぶ 48こぷ 49こむ 50こゆ 51こゅ 52こる 53ごう 54ごぅ 55ごく 56ごぐ 57ごす 58ごず 59ごつ 60ごづ 61ごぬ 62ごふ 63ごぶ 64ごぷ 65ごむ 66ごゆ 67ごゅ 68ごる 69そう 70そぅ 71そく 72そぐ 73そす 74そず 75そつ 76そづ 77そぬ 78そふ 79そぶ 80そぷ 81そむ 82そゆ 83そゅ 84そる 85ぞう 86ぞぅ 87ぞく 88ぞぐ 89ぞす 90ぞず 91ぞつ 92ぞづ 93ぞぬ 94ぞふ 95ぞぶ 96ぞぷ 97ぞむ 98ぞゆ 99ぞゅ 100ぞる 101とう 102とぅ 103とく 104とぐ 105とす 106とず 107とつ 108とづ 109とぬ 110とふ 111とぶ 112とぷ 113とむ 114とゆ 115とゅ 116とる 117どう 118どぅ 119どく 120どぐ 121どす 122どず 123どつ 124どづ 125どぬ 126どふ 127どぶ 128どぷ 129どむ 130どゆ 131どゅ 132どる 133のう 134のぅ 135のく 136のぐ 137のす 138のず 139のつ 140のづ 141のぬ 142のふ 143のぶ 144のぷ 145のむ 146のゆ 147のゅ 148のる 149ほう 150ほぅ 151ほく 152ほぐ 153ほす 154ほず 155ほつ 156ほづ 157ほぬ 158ほふ 159ほぶ 160ほぷ 161ほむ 162ほゆ 163ほゅ 164ほる 165ぼう 166ぼぅ 167ぼく 168ぼぐ 169ぼす 170ぼず 171ぼつ 172ぼづ 173ぼぬ 174ぼふ 175ぼぶ 176ぼぷ 177ぼむ 178ぼゆ 179ぼゅ 180ぼる 181ぽう 182ぽぅ 183ぽく 184ぽぐ 185ぽす 186ぽず 187ぽつ 188ぽづ 189ぽぬ 190ぽふ 191ぽぶ 192ぽぷ 193ぽむ 194ぽゆ 195ぽゅ 196ぽる 197もう 198もぅ 199もく 200もぐ 201もす 202もず 203もつ 204もづ 205もぬ 206もふ 207もぶ 208もぷ 209もむ 210もゆ 211もゅ 212もる 213よう 214よぅ 215よく 216よぐ 217よす 218よず 219よつ 220よづ 221よぬ 222よふ 223よぶ 224よぷ 225よむ 226よゆ 227よゅ 228よる 229ょう 230ょぅ 231ょく 232ょぐ 233ょす 234ょず 235ょつ 236ょづ 237ょぬ 238ょふ 239ょぶ 240ょぷ 241ょむ 242ょゆ 243ょゅ 244ょる 245ろう 246ろぅ 247ろく 248ろぐ 249ろす 250ろず 251ろつ 252ろづ 253ろぬ 254ろふ 255ろぶ 256ろぷ 257ろむ 258ろゆ 259ろゅ 260ろる

投稿2020/03/16 11:13

編集2020/03/16 14:06
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

777_superlucky

2020/03/17 03:13

回答ありがとうございます。 前に書いたプログラムを参考にしつつ作っていたので、再帰を使っていました。 考えていた処理結果が出ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問