teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

またコメント修正忘れ

2020/03/16 14:06

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -29,7 +29,7 @@
29
29
 
30
30
  /**
31
31
  * chars の各文字を循環出力する.
32
- * next() で次の文字に移動し, 最後の文字の後は先頭の文字に戻る.
32
+ * countUp() で次の文字に移動し, 最後の文字の後は先頭の文字に戻る.
33
33
  * この時, 登録されていれば CarryOverListener#carryOver() を呼び出す.
34
34
  */
35
35
  class CharCounter implements CarryOverListener {

6

出力方法を変更

2020/03/16 14:06

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -13,14 +13,20 @@
13
13
  charsRow.check(moto);
14
14
 
15
15
  StringCounter stringCounter = new StringCounter(moto, charsRow);
16
- stringCounter.outputAllPatternTo(System.out); //表示
17
- stringCounter.outputAllPatternTo("ShinIrekae.txt"); //ファイル
16
+ try (PrintStream out = new PrintStream("ShinIrekae.txt");) {
17
+ do {
18
+ System.out.println(stringCounter);
19
+ out.println(stringCounter);
20
+ } while(stringCounter.countUp());
21
+ }
18
22
  }
19
23
  }
20
24
  }
25
+
21
26
  interface CarryOverListener {
22
27
  void carryOver();
23
28
  }
29
+
24
30
  /**
25
31
  * chars の各文字を循環出力する.
26
32
  * next() で次の文字に移動し, 最後の文字の後は先頭の文字に戻る.
@@ -34,7 +40,7 @@
34
40
  this.chars = chars;
35
41
  this.listener = listener;
36
42
  }
37
- void next() {
43
+ void countUp() {
38
44
  if(++index >= chars.length) {
39
45
  index = 0;
40
46
  if(listener != null) listener.carryOver();
@@ -42,8 +48,9 @@
42
48
  }
43
49
  char get() { return chars[index]; }
44
50
  @Override
45
- public void carryOver() { next(); }
51
+ public void carryOver() { countUp(); }
46
52
  }
53
+
47
54
  class StringCounter implements CarryOverListener {
48
55
  private List<CharCounter> ccList;
49
56
  private boolean carry;
@@ -56,21 +63,25 @@
56
63
  prev = cc;
57
64
  }
58
65
  }
66
+ /**
67
+ * 最下位桁をカウントアップ
59
- void outputAllPatternTo(String filename) throws IOException {
68
+ * @return 処理後も有効値なら true (最上位桁でキャリーオーバーが発生したら false)
69
+ */
70
+ boolean countUp() {
60
- try (PrintStream out = new PrintStream(filename);) {
71
+ if(!carry) ccList.get(ccList.size()-1).countUp();
61
- outputAllPatternTo(out);
72
+ return !carry;
62
- }
63
73
  }
64
- void outputAllPatternTo(PrintStream out) {
74
+ boolean isCarryOver() { return carry; }
65
- carry = false;
66
- for (CharCounter last=ccList.get(ccList.size()-1); !carry; last.next()) {
67
- for(CharCounter cc : ccList) out.print(cc.get());
68
- out.println();
69
- }
70
- }
71
75
  @Override
72
76
  public void carryOver() { carry = true; }
77
+ @Override
78
+ public String toString() {
79
+ StringBuilder sb = new StringBuilder();
80
+ for(CharCounter cc : ccList) sb.append(cc.get());
81
+ return sb.toString();
82
+ }
73
83
  }
84
+
74
85
  class CharsRow {
75
86
  private static String[] ROWS = {
76
87
  "あぁかがさざただなはばぱまやゃらわ",

5

バグ修正

2020/03/16 13:56

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -62,6 +62,7 @@
62
62
  }
63
63
  }
64
64
  void outputAllPatternTo(PrintStream out) {
65
+ carry = false;
65
66
  for (CharCounter last=ccList.get(ccList.size()-1); !carry; last.next()) {
66
67
  for(CharCounter cc : ccList) out.print(cc.get());
67
68
  out.println();

4

コード内コメント直し忘れ

2020/03/16 13:37

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -22,7 +22,7 @@
22
22
  void carryOver();
23
23
  }
24
24
  /**
25
- * source の各文字を循環出力する.
25
+ * chars の各文字を循環出力する.
26
26
  * next() で次の文字に移動し, 最後の文字の後は先頭の文字に戻る.
27
27
  * この時, 登録されていれば CarryOverListener#carryOver() を呼び出す.
28
28
  */

3

コード改良

2020/03/16 13:33

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -12,7 +12,7 @@
12
12
  CharsRow charsRow = new CharsRow();
13
13
  charsRow.check(moto);
14
14
 
15
- StringCounter stringCounter = new StringCounter(moto);
15
+ StringCounter stringCounter = new StringCounter(moto, charsRow);
16
16
  stringCounter.outputAllPatternTo(System.out); //表示
17
17
  stringCounter.outputAllPatternTo("ShinIrekae.txt"); //ファイル
18
18
  }
@@ -47,9 +47,8 @@
47
47
  class StringCounter implements CarryOverListener {
48
48
  private List<CharCounter> ccList;
49
49
  private boolean carry;
50
- StringCounter(String moto) {
50
+ StringCounter(String moto, CharsRow charsRow) {
51
51
  ccList = new ArrayList<>();
52
- CharsRow charsRow = new CharsRow();
53
52
  CarryOverListener prev = this;
54
53
  for(char c : moto.toCharArray()){
55
54
  CharCounter cc = new CharCounter(charsRow.get(c), prev);

2

クラス分け

2020/03/16 13:06

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -9,69 +9,18 @@
9
9
  System.out.println("どのような文の子音を変えますか?");
10
10
  String moto = buf.readLine();
11
11
 
12
+ CharsRow charsRow = new CharsRow();
12
- hikaku(moto);
13
+ charsRow.check(moto);
13
- mk(moto);
14
- }
15
- }
16
14
 
17
- private static void hikaku(String moto){
15
+ StringCounter stringCounter = new StringCounter(moto);
18
- for(char c : moto.toCharArray()){
19
- String r = getCharsRow(c);
16
+ stringCounter.outputAllPatternTo(System.out); //表示
20
- if(r != null) {
21
- System.out.println(c + "は、" + r.charAt(0) + (r.length()>=2?"段にあります":"です"));
17
+ stringCounter.outputAllPatternTo("ShinIrekae.txt"); //ファイル
22
- }
23
18
  }
24
19
  }
25
-
26
- private static void mk(String moto) throws IOException {
27
- List<CharCounter> ccList = new ArrayList<>();
28
- CarryFlag carryFlag = new CarryFlag();
29
- CarryOverListener prev = carryFlag;
30
- for(char c : moto.toCharArray()){
31
- String r = getCharsRow(c);
32
- CharCounter cc = new CharCounter(r!=null?r:""+c, prev);
33
- ccList.add(cc);
34
- prev = cc;
35
- }
36
-
37
- try (BufferedWriter bw = new BufferedWriter(new FileWriter("ShinIrekae.txt"));) {
38
- StringBuilder sb = new StringBuilder();
39
- for (CharCounter last = ccList.get(ccList.size()-1); !carryFlag.isOn(); last.next()) {
40
- sb.delete(0, sb.length());
41
- for(CharCounter cc : ccList) sb.append(cc.get());
42
- System.out.println(sb.toString());
43
- bw.write(sb.toString());
44
- bw.newLine();
45
- }
46
- }
47
- }
48
-
49
- private static String getCharsRow(char c) {
50
- for(String r : ROWS) {
51
- if(r.indexOf(c) >= 0) return r;
52
- }
53
- return null;
54
- }
55
-
56
- private static String A = "あぁかがさざただなはばぱまやゃらわ";
57
- private static String I = "いぃきぎしじちぢにひびぴみりゐ";
58
- private static String U = "うぅくぐすずつづぬふぶぷむゆゅる";
59
- private static String E = "えぇけげせぜてでねへべぺめれゑ";
60
- private static String O = "おぉこごそぞとどのほぼぽもよょろ";
61
- private static String N = "ん";
62
- private static String[] ROWS = {A,I,U,E,O,N};
63
20
  }
64
21
  interface CarryOverListener {
65
22
  void carryOver();
66
23
  }
67
- class CarryFlag implements CarryOverListener {
68
- private boolean flag = false;
69
- @Override
70
- public void carryOver() {
71
- flag = true;
72
- }
73
- boolean isOn() { return flag; }
74
- }
75
24
  /**
76
25
  * source の各文字を循環出力する.
77
26
  * next() で次の文字に移動し, 最後の文字の後は先頭の文字に戻る.
@@ -81,10 +30,9 @@
81
30
  private CarryOverListener listener;
82
31
  private char[] chars;
83
32
  private int index;
84
- CharCounter(String source, CarryOverListener l) {
33
+ CharCounter(char[] chars, CarryOverListener listener) {
85
- this.chars = source.toCharArray();
34
+ this.chars = chars;
86
- this.listener = l;
35
+ this.listener = listener;
87
- index = 0;
88
36
  }
89
37
  void next() {
90
38
  if(++index >= chars.length) {
@@ -96,6 +44,67 @@
96
44
  @Override
97
45
  public void carryOver() { next(); }
98
46
  }
47
+ class StringCounter implements CarryOverListener {
48
+ private List<CharCounter> ccList;
49
+ private boolean carry;
50
+ StringCounter(String moto) {
51
+ ccList = new ArrayList<>();
52
+ CharsRow charsRow = new CharsRow();
53
+ CarryOverListener prev = this;
54
+ for(char c : moto.toCharArray()){
55
+ CharCounter cc = new CharCounter(charsRow.get(c), prev);
56
+ ccList.add(cc);
57
+ prev = cc;
58
+ }
59
+ }
60
+ void outputAllPatternTo(String filename) throws IOException {
61
+ try (PrintStream out = new PrintStream(filename);) {
62
+ outputAllPatternTo(out);
63
+ }
64
+ }
65
+ void outputAllPatternTo(PrintStream out) {
66
+ for (CharCounter last=ccList.get(ccList.size()-1); !carry; last.next()) {
67
+ for(CharCounter cc : ccList) out.print(cc.get());
68
+ out.println();
69
+ }
70
+ }
71
+ @Override
72
+ public void carryOver() { carry = true; }
73
+ }
74
+ class CharsRow {
75
+ private static String[] ROWS = {
76
+ "あぁかがさざただなはばぱまやゃらわ",
77
+ "いぃきぎしじちぢにひびぴみりゐ",
78
+ "うぅくぐすずつづぬふぶぷむゆゅる",
79
+ "えぇけげせぜてでねへべぺめれゑ",
80
+ "おぉこごそぞとどのほぼぽもよょろ",
81
+ };
82
+ private Map<Character,char[]> cache = new HashMap<>();
83
+ void check(String moto) {
84
+ for(char c : moto.toCharArray()){
85
+ char[] r = get(c);
86
+ System.out.println(c + "は、" + r[0] + (r.length>=2?"段にあります":"です"));
87
+ }
88
+ }
89
+ char[] get(char c) {
90
+ for(String r : ROWS) {
91
+ if(r.indexOf(c) >= 0) {
92
+ char[] a = cache.get(r.charAt(0));
93
+ if(a == null) {
94
+ a = r.toCharArray();
95
+ cache.put(r.charAt(0), a);
96
+ }
97
+ return a;
98
+ }
99
+ }
100
+ char[] a = cache.get(c);
101
+ if(a == null) {
102
+ a = new char[]{c};
103
+ cache.put(c, a);
104
+ }
105
+ return a;
106
+ }
107
+ }
99
108
  ```
100
109
  ```plain text
101
110
  どのような文の子音を変えますか?

1

getCharsRow 追加

2020/03/16 12:40

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -15,13 +15,10 @@
15
15
  }
16
16
 
17
17
  private static void hikaku(String moto){
18
- final String[] rows = {A,I,U,E,O,N};
19
18
  for(char c : moto.toCharArray()){
20
- for(String r : rows) {
19
+ String r = getCharsRow(c);
21
- if(r.indexOf(c) >= 0) {
20
+ if(r != null) {
22
- System.out.println(c + "は、" + r.charAt(0) + (r.length()>=2?"段にあります":"です"));
21
+ System.out.println(c + "は、" + r.charAt(0) + (r.length()>=2?"段にあります":"です"));
23
- continue;
24
- }
25
22
  }
26
23
  }
27
24
  }
@@ -30,16 +27,9 @@
30
27
  List<CharCounter> ccList = new ArrayList<>();
31
28
  CarryFlag carryFlag = new CarryFlag();
32
29
  CarryOverListener prev = carryFlag;
33
- String[] rows = {A,I,U,E,O};
34
30
  for(char c : moto.toCharArray()){
35
- CharCounter cc = null;
36
- for(String r : rows) {
31
+ String r = getCharsRow(c);
37
- if(r.indexOf(c) >= 0) {
38
- cc = new CharCounter(r, prev);
39
- break;
40
- }
41
- }
42
- if(cc == null) cc = new CharCounter(""+c, prev);
32
+ CharCounter cc = new CharCounter(r!=null?r:""+c, prev);
43
33
  ccList.add(cc);
44
34
  prev = cc;
45
35
  }
@@ -56,12 +46,20 @@
56
46
  }
57
47
  }
58
48
 
49
+ private static String getCharsRow(char c) {
50
+ for(String r : ROWS) {
51
+ if(r.indexOf(c) >= 0) return r;
52
+ }
53
+ return null;
54
+ }
55
+
59
56
  private static String A = "あぁかがさざただなはばぱまやゃらわ";
60
57
  private static String I = "いぃきぎしじちぢにひびぴみりゐ";
61
58
  private static String U = "うぅくぐすずつづぬふぶぷむゆゅる";
62
59
  private static String E = "えぇけげせぜてでねへべぺめれゑ";
63
60
  private static String O = "おぉこごそぞとどのほぼぽもよょろ";
64
61
  private static String N = "ん";
62
+ private static String[] ROWS = {A,I,U,E,O,N};
65
63
  }
66
64
  interface CarryOverListener {
67
65
  void carryOver();