前提・実現したいこと
以前に 入力された文を、母音が一緒の文字に入れ替えたい で回答していただいた事や調べた事をまとめて、文字列をアナグラム・同じ段(例 てはえ段)にある文字で置き換えをするコードを書いたのですが、実際に処理をする際は文字列が10文字以上になる事が多く、実行時間がとても長くなります。
他に同じようなコードがあまり無いため、処理の時間が適正なのかそうでないのか分からないのですが、改善点などありましたら回答をお願いしたいです。
発生している問題・エラーメッセージ
処理に時間がかかる原因(無駄な処理など)を減らしたい
該当のソースコード
Java
1import java.io.*; 2import java.nio.file.*; 3import java.util.*; 4 5public class AmRt{ 6 public static void main(String args[]){ 7 Sakusei("てらている", "テラテイル"); 8 } 9 10 public static void Sakusei(String Target, String FileName){ 11 String Ans = ""; 12 String Indicate = ""; 13 String FilePath = "/home/lucky/Test/"; 14 ArrayList<String> List = new ArrayList<String>(); 15 Pn(Target, Ans, Indicate, FilePath, FileName, List); 16 Rt(Target, Ans, Indicate, FilePath, FileName, List); 17 } 18 19 20 public static void Pn(String Pq, String PAns, String PIn, String PFP, String PFN, ArrayList PLi){ 21 PFN = ("アナグラム_ひらがな_" + PFN + ".txt"); 22 FileDeletionMaking(PFP, PFN); 23 Permutation(Pq, PAns, PIn, PFP, PFN, PLi); 24 } 25 26 public static void Permutation(String Pq, String Pans, String PIn, String PFP, String PFN, ArrayList PLi){ 27 if(Pq.length()<=1){ 28 PIn = Pans + Pq; 29 PLi.add(PIn); 30 if(PLi.size() == 1000000){ 31 FileWriting(PFP, PFN, PLi); 32 } 33 }else{ 34 for(int Pa=0; Pa<Pq.length(); Pa++){ 35 Permutation(Pq.substring(0, Pa) + Pq.substring(Pa+1), Pans + Pq.charAt(Pa), PIn, PFP, PFN, PLi); 36 } 37 } 38 FileWriting(PFP, PFN, PLi); 39 } 40 41 42 public static void Rt(String Rq, String RAns, String RIn, String RFP, String RFN, ArrayList RLi){ 43 RFN = "置き換え_ひらがな_" + RFN + ".txt"; 44 FileDeletionMaking(RFP, RFN); 45 Replacement(Rq, RAns, RIn, RFP, RFN, RLi); 46 } 47 48 public static void Replacement(String Rq, String Rans, String RIn, String RFP, String RFN, ArrayList RLi){ 49 final String[] RHi = { 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 for (int Ri = 0; Ri < Rq.length(); Ri++) { 75 int Rj = getDan(Rq.charAt(Ri), RHi); 76 } 77 char[] Rca = new char[Rq.length()]; 78 gen(0, Rq, Rans, RHi, Rca, RFP, RFN, RLi); 79 FileWriting(RFP, RFN, RLi); 80 } 81 82 public static int getDan(char Rc, String[] RHi) { 83 for (int Rx = 0; Rx < RHi.length; Rx++){ 84 if (RHi[Rx].indexOf(Rc) >= 0){ 85 return Rx; 86 } 87 } 88 return -1; 89 } 90 91 public static void gen(int R, String Rq, String Rans, String[] RHi, char[] Rca, String RFP, String RFN, ArrayList RLi) { 92 int Rj = 0; 93 int Rk = 0; 94 if (R == Rq.length()){ 95 Rans = new String(Rca); 96 RLi.add(Rans); 97 if(RLi.size() == 1000000){ 98 FileWriting(RFP, RFN, RLi); 99 } 100 } else { 101 Rj = getDan(Rq.charAt(R), RHi); 102 Rk = RHi[Rj].length(); 103 for (int Ry = 0; Ry < Rk; Ry++) { 104 Rca[R] = RHi[Rj].charAt(Ry); 105 gen(R+1, Rq, Rans, RHi, Rca, RFP, RFN, RLi); 106 } 107 } 108 } 109 110 111 112 public static void FileDeletionMaking(String DMP, String DMN){ 113 try{ 114 if(Files.exists(Paths.get(DMP, DMN))){ 115 Files.delete(Paths.get(DMP, DMN)); 116 } 117 Files.createFile(Paths.get(DMP, DMN)); 118 }catch(IOException ex){ 119 ex.printStackTrace(); 120 } 121 } 122 123 public static void FileWriting(String FWP, String FWN, ArrayList FWL){ 124 try{ 125 Files.write(Paths.get(FWP, FWN), FWL, StandardOpenOption.APPEND); 126 }catch(IOException ey){ 127 System.out.println("FWP=" + FWP + ", FWN=" + FWN); 128 } 129 FWL.clear(); 130 } 131}
試したこと
・アナグラムや置き換えを行った結果を1回ずつ書き込むのではなく、リストに格納し あとからまとめて書き込むように変えた
・処理結果の文字列を表示させなくした
補足情報(FW/ツールのバージョンなど)
Oracle VirtualBox Ver.6.1.12
CentOS 7.5.1804
回答1件
あなたの回答
tips
プレビュー