質問編集履歴

5

2016/11/28 16:16

投稿

Kazuki_wbox
Kazuki_wbox

スコア7

test CHANGED
File without changes
test CHANGED
@@ -233,3 +233,9 @@
233
233
  #等を入力させて終了させるとかそもそも別のやり方があるだろうという方もいらっしゃると思います。
234
234
 
235
235
  その通りだと思います。良い案があれば是非教えていただきたいです。
236
+
237
+
238
+
239
+ 間違った表現を修正しました。
240
+
241
+ ご指摘ありがとうございます。

4

2016/11/28 16:16

投稿

Kazuki_wbox
Kazuki_wbox

スコア7

test CHANGED
File without changes
test CHANGED
@@ -12,9 +12,9 @@
12
12
 
13
13
 
14
14
 
15
- 0. 適当な文字列その2を1.と同じ条件で入力(ただし空欄は許さない)
15
+ 0. 適当な文字列その2を1.と同じ条件で入力
16
-
16
+
17
- どちらか片方でも空欄の場合は不正として再入力させる
17
+ どちらか片方空欄の場合は不正として再入力させる
18
18
 
19
19
 
20
20
 

3

書式の改善

2016/11/28 16:15

投稿

Kazuki_wbox
Kazuki_wbox

スコア7

test CHANGED
File without changes
test CHANGED
@@ -184,6 +184,28 @@
184
184
 
185
185
 
186
186
 
187
+
188
+
189
+ 正規表現「^[a-zA-Z0-9]{3,11}$」ですと入力なしの時もfind()でfalseになってしまいます。
190
+
191
+
192
+
193
+ str1とstr2の文字数が0の時に終了と判断すればいいかと思い書いてみましたが
194
+
195
+ 入力エラーとなってしまったり
196
+
197
+ ならばその内側に正規表現とも一致しない条件を追加して。。。
198
+
199
+ とやっていたら思い通りに動きました。
200
+
201
+ が、なんかごちゃごちゃしている気がします。
202
+
203
+
204
+
205
+ もっと頭のいい人がうまく作るとどうなるのだろうか気になり質問させて頂いております。
206
+
207
+
208
+
187
209
  *私は3ヶ月ほど前にプログラミングを始めたばかりなので超基本を知らなかったり、忘れていたりします。
188
210
 
189
211
  ぜひその辺り思い当たれば伝えていただきたいです。
@@ -211,5 +233,3 @@
211
233
  #等を入力させて終了させるとかそもそも別のやり方があるだろうという方もいらっしゃると思います。
212
234
 
213
235
  その通りだと思います。良い案があれば是非教えていただきたいです。
214
-
215
- が、できればこのやり方でソースコードをきれいにしてみたいのでよろしくお願いします。

2

ソースコードを追加

2016/11/28 15:55

投稿

Kazuki_wbox
Kazuki_wbox

スコア7

test CHANGED
File without changes
test CHANGED
@@ -28,49 +28,159 @@
28
28
 
29
29
  終了
30
30
 
31
+
32
+
33
+ ```Java
34
+
35
+ public ArrayList<StrClass> input() {
36
+
37
+
38
+
39
+ Pattern p = Pattern.compile("^[a-zA-Z0-9]{3,11}$");
40
+
41
+ Matcher m;
42
+
43
+ boolean is_valid_str1;
44
+
45
+ boolean is_valid_str2;
46
+
47
+ String user_input_str1;
48
+
49
+ String user_input_str2;
50
+
51
+
52
+
53
+ ArrayList<StrClass> strList = new ArrayList<StrClass>();
54
+
55
+
56
+
57
+ try {
58
+
59
+
60
+
61
+ //文字列その1 入力
62
+
63
+ user_input_str1 = br.readLine();
64
+
65
+ m = p.matcher(user_input_str1);
66
+
67
+ is_valid_str1 = m.matches();
68
+
69
+
70
+
71
+ //文字列その2 入力
72
+
73
+ user_input_str2 = br.readLine();
74
+
75
+ m = p.matcher(user_input_str2);
76
+
77
+ is_valid_str2 = m.matches();
78
+
79
+
80
+
81
+ if(is_valid_str1 && is_valid_str2){
82
+
83
+ StrClass strClass = new StrClass();
84
+
85
+ strClass.setterStr1(user_input_str1);
86
+
87
+ strClass.setterStr2(user_input_str2);
88
+
89
+ strClass.add(strClass);
90
+
91
+ }else if(user_input_str1.length() != 0 && user_input_str2.length() != 0){
92
+
93
+ if(!is_valid_str1 || !is_valid_str2){
94
+
95
+ //エラー 文字列が不正
96
+
97
+ continue;
98
+
99
+ }
100
+
101
+ }else if(user_input_str1.length() == 0 && user_input_str2.length() == 0){
102
+
103
+
104
+
105
+ boolean not_fin_flag = true;
106
+
107
+
108
+
109
+ while(not_fin_flag){
110
+
111
+ //入力を終了するか確認
112
+
113
+ String is_input_fin = br.readLine();
114
+
115
+
116
+
117
+ if(is_input_fin.equals("y") || is_input_fin.equals("Y")){
118
+
119
+ not_fin_flag = false;
120
+
121
+ break;
122
+
123
+ }else if(is_input_fin.equals("n") || is_input_fin.equals("N")){
124
+
125
+ not_fin_flag = true;
126
+
127
+ break;
128
+
129
+ }else{
130
+
131
+ //エラー y/n以外の入力がされた
132
+
133
+ }
134
+
135
+ }
136
+
137
+
138
+
139
+ if(not_fin_flag){
140
+
141
+ continue;
142
+
143
+ }else{
144
+
145
+ break;
146
+
147
+ }
148
+
149
+ }else{
150
+
151
+ //エラー 文字列が不正
152
+
153
+ continue;
154
+
155
+ }
156
+
157
+ } catch (IOException e) {
158
+
159
+ // TODO 自動生成された catch ブロック
160
+
161
+ // 例外の使い方はまだ知らないです。eclipseが怒るのでつけました。
162
+
163
+ e.printStackTrace();
164
+
165
+ }
166
+
167
+
168
+
169
+ return strList;
170
+
171
+ }
172
+
173
+ ```
174
+
175
+
176
+
31
177
  ###入力チェック、終了確認の段階でif文が大量発生
32
178
 
33
179
 
34
180
 
35
181
  ```
36
182
 
37
- 入力チェックには正規表現を使っています。『^[a-zA-Z0-9]{3,11}$』
38
-
39
- しかし、片方だけ空欄の時はエラー、共に空欄の時は終了する。
40
-
41
- ここで見出し通りの事態に陥っています。
42
-
43
-
44
-
45
- この正規表現ですと、空欄を不正と判断します。
46
-
47
- 片方だけが空欄の時は不正、両方とも空欄なら終了と判断すると、両方に全角や記号等を入力された時にも終了してしまいます。
48
-
49
- ですので文字数が共に0だった時、両方が不正なら終了して終了確認をすることにしました。
50
-
51
-
52
-
53
- 終了確認は y/n を入力してもらうので、
54
-
55
- yなのか、nなのか、それ以外なのか
56
-
57
- それ以外の場合は不正であるとして再入力を促します。
58
-
59
-
60
-
61
- こまでやったところでソースコード読み返すと大変になっていました。
183
+ の継ぎ接ぎな感じをなかしたと思いましたが、精一杯やってみてこれです
62
-
63
-
64
-
65
- 確認は
66
-
67
- while(true)の無限ループを作り、if文でyまたはnが入力されたらbreak
68
-
69
- というようになっていて、これが上記のif文の中に入っています。
70
-
71
-
72
-
73
- ただでさえ分岐の多い中、whileの中にifが入っているとなると分かりづらいです。
74
184
 
75
185
 
76
186
 

1

初心者マークを追加

2016/11/28 15:33

投稿

Kazuki_wbox
Kazuki_wbox

スコア7

test CHANGED
File without changes
test CHANGED
File without changes