質問編集履歴

7

ミスがありました

2020/07/02 22:13

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -21,333 +21,3 @@
21
21
  またリスト内に含まれる「i」を検索して、
22
22
 
23
23
  大文字に変える方法はございませんか?
24
-
25
-
26
-
27
- ```
28
-
29
- iのインデックスは53です
30
-
31
- 後ろから調べたiのインデックスは53
32
-
33
-
34
-
35
- ```
36
-
37
-
38
-
39
- ### 該当のソースコード
40
-
41
-
42
-
43
- ```java
44
-
45
-
46
-
47
- import java.io.*;
48
-
49
- import java.util.*;
50
-
51
- public class Q {
52
-
53
-
54
-
55
- //   「1つ以上のスペース、ピリオド、コンマ、セミコロンのどれか」という意味
56
-
57
- // |は区切ったもののどれかという意味で、.は単にピリオドです(文字列表記する都合上、バックスラッシュが2つ必要)
58
-
59
- private static final String SEPARATOR = "(\s+?|\.|,|;)";
60
-
61
- /**
62
-
63
- * データファイルを開く
64
-
65
- * resources/q003/data.txt
66
-
67
- */
68
-
69
- private static InputStream openDataFile() {
70
-
71
- //getResourceAsStreamメソッドを利用すると、リソースファイル(設定ファイルなどのこと)を簡単に読み込むことができる
72
-
73
- return Q003.class.getResourceAsStream("data.txt");
74
-
75
- }
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
- public static void main(String[] args){
84
-
85
-
86
-
87
- // 集計
88
-
89
- //カウントには以下のMap<String, Integer>を使用
90
-
91
- Map<String, Integer> map = new HashMap<>();
92
-
93
- try (
94
-
95
- /*
96
-
97
- ファイルの読み込み main配下にあるresourcesからファイルを取得している
98
-
99
-  FileReaderを使ってファイルを読み込む場合には、1文字読み込んでは1文字処理して、と言うのを繰り返すため、非常に効率が悪い
100
-
101
- */
102
-
103
- FileReader fr = new FileReader(Q003.class.getResource("data.txt").getFile());
104
-
105
-
106
-
107
- /*
108
-
109
- ファイルの読み込み
110
-
111
-  なぜ最初からこのクラスを使わないかというと、このクラスはFileReaderクラスを拡張する形で利用するため。
112
-
113
-   FileReaderクラスの持つ基本機能でファイルから読み込みは行うが、
114
-
115
-  それにBufferedReaderクラスをかぶせて使うことでまとめて読み込む機能を持てるようになる
116
-
117
- */
118
-
119
- BufferedReader br = new BufferedReader(fr)){
120
-
121
-
122
-
123
- /*
124
-
125
- テキストを1行単位で読む
126
-
127
- 1行まとめて読むための"readLine"メソッドが用意されている。
128
-
129
- 注意する点は、改行文字は読み込んだ文字に含まれない事
130
-
131
- よって1行ごとに、改行を含まないテキストを読み込んでString型の値として返す
132
-
133
- */
134
-
135
- String line;
136
-
137
- //テキストファイルの読み取りの箇所ではreadLine()で行を取得
138
-
139
- while ((line = br.readLine()) != null) {
140
-
141
-
142
-
143
- /*
144
-
145
- 全て大文字に変換する。
146
-
147
- */
148
-
149
- String resultline = line.toLowerCase();
150
-
151
-
152
-
153
- //splitメソッドでword[]に分割して格納していく。
154
-
155
- String[] words = resultline.split(SEPARATOR);
156
-
157
-
158
-
159
- //繰り返し処理
160
-
161
- for (String word : words) {
162
-
163
- //もしwordがからでないなら…   文字列が空かどうかを判定する – isEmptyメソッド
164
-
165
- //分解後に空白1文字が残る場合に備え、単語の出現数のカウントではisEmpty()メソッドを使用
166
-
167
- if (!word.isEmpty()) {
168
-
169
-
170
-
171
-
172
-
173
- /*
174
-
175
- containsKeyメソッドは、指定したキーが存在するか確認を行い、キーが存在する場合は「true」を返します
176
-
177
- Map.containsKey(検索するキー)
178
-
179
-
180
-
181
- キー→単語
182
-
183
- 値 →出現数
184
-
185
-
186
-
187
- 単語wordが与えられたときの処理は以下の考え方。 
188
-
189
-  単語がMapのキーに含まれている場合、出現数を加算する。
190
-
191
-  単語がMapのキーに含まれていない場合、以下をMapに格納する。  
192
-
193
-  キー word
194
-
195
-  値   1
196
-
197
- */
198
-
199
- if (map.containsKey(word)) {
200
-
201
- /*
202
-
203
- 要素を取り出すためにgetメソッドを使用する。 get(Object key)
204
-
205
- 要素を格納するためにputメソッドを使用する。 put(K key, V value)
206
-
207
- */
208
-
209
- int count = map.get(word) + 1;
210
-
211
- map.put(word, count);
212
-
213
- } else {
214
-
215
- map.put(word, 1);
216
-
217
- }
218
-
219
- }
220
-
221
- }
222
-
223
-
224
-
225
- }
226
-
227
- } catch (FileNotFoundException e) {
228
-
229
- System.out.println("ファイルが見つかりませんでした。");
230
-
231
- } catch (IOException e) {
232
-
233
- System.out.println("読み取りに失敗しました。");
234
-
235
- }
236
-
237
-
238
-
239
-
240
-
241
- /*
242
-
243
- アルファベット辞書順に並び変えて出力
244
-
245
- 条件
246
-
247
- * - "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)  
248
-
249
- * - 単数形と複数形のように少しでも文字列が異れば別単語として扱う("dream"と"dreams"は別単語)
250
-
251
- * - アポストロフィーやハイフン付の単語は1単語として扱う("isn't"や"dead-end")
252
-
253
- */
254
-
255
-
256
-
257
- List<String> list = new ArrayList<>();
258
-
259
- int maxLengthOfSpelling = 0;
260
-
261
-
262
-
263
- for (String key : map.keySet()) {
264
-
265
- list.add(key);
266
-
267
-
268
-
269
- if (maxLengthOfSpelling < key.length()) {
270
-
271
- maxLengthOfSpelling = key.length();
272
-
273
- }
274
-
275
- }
276
-
277
-
278
-
279
-
280
-
281
- /*
282
-
283
- アルファベット順にソート
284
-
285
- "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)
286
-
287
- Comparatorインターフェースを用いた方法ではソートするための条件をプログラマが決めることができる。
288
-
289
- 複雑な条件でのソートやオブジェクトの並び替えを特定のルールに沿って行いたいときは、この方法を用いる
290
-
291
- */
292
-
293
- Collections.sort(list, new Comparator<String>() {
294
-
295
- @Override
296
-
297
- public int compare(String s1, String s2) {
298
-
299
- return s1.compareToIgnoreCase(s2);
300
-
301
- }
302
-
303
- });
304
-
305
-
306
-
307
-
308
-
309
- /*
310
-
311
- どこかのタイミングで 格納されているiを見つけ出し、
312
-
313
- toUpperCaseメソッドで、小文字を大文字に変換すると解決する。
314
-
315
- */
316
-
317
- System.out.println("iのインデックスは" + list.indexOf("i") + "です");
318
-
319
- System.out.println("後ろから調べたiのインデックスは"+list.lastIndexOf("i"));
320
-
321
- // list.set(list.indexOf("i"), "I");
322
-
323
-
324
-
325
-
326
-
327
-
328
-
329
- // 全部の値を出力
330
-
331
- String format = "%-" + maxLengthOfSpelling + "s= %3d";
332
-
333
- for (String word : list) {
334
-
335
-
336
-
337
- int count = map.get(word);
338
-
339
- //出力の回数を制限するなら、ここで if (出現させたい件数 <= count)で可能
340
-
341
- System.out.printf(format, word, count);
342
-
343
- System.out.println();
344
-
345
-
346
-
347
- }
348
-
349
- }
350
-
351
- }
352
-
353
- ```

6

タイトルをかえました

2020/07/02 22:13

投稿

tapipi
tapipi

スコア13

test CHANGED
@@ -1 +1 @@
1
- Listの特定の位置の値を変更したい
1
+ 位置の値を変更したい
test CHANGED
File without changes

5

わかりやすくしました

2020/07/02 22:03

投稿

tapipi
tapipi

スコア13

test CHANGED
@@ -1 +1 @@
1
- 特定の文字だけ区別てソートしてくれる方法
1
+ Listの特定の位置の値を変更たい
test CHANGED
@@ -1,80 +1,296 @@
1
+ ### 前提・実現したいこと
2
+
3
+
4
+
5
+ list.set(list.indexOf("i"), "I");
6
+
1
- ある特定の文字区別して、ソートした際に区別できるようにしたです
7
+ 使用して、53番目の位置の値を変更したい。
8
+
9
+
10
+
2
-
11
+ ですが、エラー
12
+
3
-
13
+ Exception in thread "main" java.lang.NullPointerException
4
-
14
+
5
- 現在以下のように出力されており
15
+ と指定した場所がありませんと表示されます…。
16
+
6
-
17
+ どうしたら53番目の値を変更できますか?
18
+
19
+
20
+
21
+ またリスト内に含まれる「i」を検索して、
22
+
7
- 以下のような問題点がございます。
23
+ 大文字に変える方法はございませんか?
8
-
9
-
10
-
11
-
12
-
13
- ①特定の文字”I”以外は小文字として扱うようにしたい。
24
+
14
-
15
- 例:Whyとwhyは同じく”why”として扱う。
25
+
16
-
17
-
18
-
26
+
19
- 【現在の表示
27
+ ```
20
-
28
+
21
- highest = 1
29
+ iのインデックスは53です
22
-
30
+
23
- I = 3
31
+ 後ろから調べたiのインデックスは53
24
-
25
- if = 1
32
+
26
-
27
- If = 1
33
+
28
-
29
-
30
-
34
+
31
- これを
35
+ ```
32
-
36
+
37
+
38
+
33
- I はそまま
39
+ ### 該当ソースコード
34
-
35
- ifは Ifとifで2つとしてカウント
36
-
37
- 【行いたい表示方法
38
-
39
- I=3
40
-
41
- if=2 としてカウントしてほしいです。
42
-
43
-
44
-
45
-
46
-
47
- 考えているのは、
48
-
49
- Comparatorインターフェースを用いた方法で、ソートするための条件を組めばよいと考えております。
50
-
51
-
52
40
 
53
41
 
54
42
 
55
43
  ```java
56
44
 
57
- public static void main(String[] args) {
58
-
59
- ArrayList<String> foo = new ArrayList<>();
60
-
61
-
62
-
63
- foo.add("highest");
64
-
65
- foo.add("if");
66
-
67
- foo.add("If");
68
-
69
- foo.add("I");
70
-
71
- foo.add("Add");
72
-
73
-
74
-
75
-
76
-
77
- Collections.sort(foo, new Comparator<String>() {
45
+
46
+
47
+ import java.io.*;
48
+
49
+ import java.util.*;
50
+
51
+ public class Q {
52
+
53
+
54
+
55
+ //   「1つ以上のスペース、ピリオド、コンマ、セミコロンのどれか」という意味
56
+
57
+ // |は区切ったもののどれかという意味で、.は単にピリオドです(文字列表記する都合上、バックスラッシュが2つ必要)
58
+
59
+ private static final String SEPARATOR = "(\s+?|\.|,|;)";
60
+
61
+ /**
62
+
63
+ * データファイルを開く
64
+
65
+ * resources/q003/data.txt
66
+
67
+ */
68
+
69
+ private static InputStream openDataFile() {
70
+
71
+ //getResourceAsStreamメソッドを利用すると、リソースファイル(設定ファイルなどのこと)を簡単に読み込むことができる
72
+
73
+ return Q003.class.getResourceAsStream("data.txt");
74
+
75
+ }
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+ public static void main(String[] args){
84
+
85
+
86
+
87
+ // 集計
88
+
89
+ //カウントには以下のMap<String, Integer>を使用
90
+
91
+ Map<String, Integer> map = new HashMap<>();
92
+
93
+ try (
94
+
95
+ /*
96
+
97
+ ファイルの読み込み main配下にあるresourcesからファイルを取得している
98
+
99
+  FileReaderを使ってファイルを読み込む場合には、1文字読み込んでは1文字処理して、と言うのを繰り返すため、非常に効率が悪い
100
+
101
+ */
102
+
103
+ FileReader fr = new FileReader(Q003.class.getResource("data.txt").getFile());
104
+
105
+
106
+
107
+ /*
108
+
109
+ ファイルの読み込み
110
+
111
+  なぜ最初からこのクラスを使わないかというと、このクラスはFileReaderクラスを拡張する形で利用するため。
112
+
113
+   FileReaderクラスの持つ基本機能でファイルから読み込みは行うが、
114
+
115
+  それにBufferedReaderクラスをかぶせて使うことでまとめて読み込む機能を持てるようになる
116
+
117
+ */
118
+
119
+ BufferedReader br = new BufferedReader(fr)){
120
+
121
+
122
+
123
+ /*
124
+
125
+ テキストを1行単位で読む
126
+
127
+ 1行まとめて読むための"readLine"メソッドが用意されている。
128
+
129
+ 注意する点は、改行文字は読み込んだ文字に含まれない事
130
+
131
+ よって1行ごとに、改行を含まないテキストを読み込んでString型の値として返す
132
+
133
+ */
134
+
135
+ String line;
136
+
137
+ //テキストファイルの読み取りの箇所ではreadLine()で行を取得
138
+
139
+ while ((line = br.readLine()) != null) {
140
+
141
+
142
+
143
+ /*
144
+
145
+ 全て大文字に変換する。
146
+
147
+ */
148
+
149
+ String resultline = line.toLowerCase();
150
+
151
+
152
+
153
+ //splitメソッドでword[]に分割して格納していく。
154
+
155
+ String[] words = resultline.split(SEPARATOR);
156
+
157
+
158
+
159
+ //繰り返し処理
160
+
161
+ for (String word : words) {
162
+
163
+ //もしwordがからでないなら…   文字列が空かどうかを判定する – isEmptyメソッド
164
+
165
+ //分解後に空白1文字が残る場合に備え、単語の出現数のカウントではisEmpty()メソッドを使用
166
+
167
+ if (!word.isEmpty()) {
168
+
169
+
170
+
171
+
172
+
173
+ /*
174
+
175
+ containsKeyメソッドは、指定したキーが存在するか確認を行い、キーが存在する場合は「true」を返します
176
+
177
+ Map.containsKey(検索するキー)
178
+
179
+
180
+
181
+ キー→単語
182
+
183
+ 値 →出現数
184
+
185
+
186
+
187
+ 単語wordが与えられたときの処理は以下の考え方。 
188
+
189
+  単語がMapのキーに含まれている場合、出現数を加算する。
190
+
191
+  単語がMapのキーに含まれていない場合、以下をMapに格納する。  
192
+
193
+  キー word
194
+
195
+  値   1
196
+
197
+ */
198
+
199
+ if (map.containsKey(word)) {
200
+
201
+ /*
202
+
203
+ 要素を取り出すためにgetメソッドを使用する。 get(Object key)
204
+
205
+ 要素を格納するためにputメソッドを使用する。 put(K key, V value)
206
+
207
+ */
208
+
209
+ int count = map.get(word) + 1;
210
+
211
+ map.put(word, count);
212
+
213
+ } else {
214
+
215
+ map.put(word, 1);
216
+
217
+ }
218
+
219
+ }
220
+
221
+ }
222
+
223
+
224
+
225
+ }
226
+
227
+ } catch (FileNotFoundException e) {
228
+
229
+ System.out.println("ファイルが見つかりませんでした。");
230
+
231
+ } catch (IOException e) {
232
+
233
+ System.out.println("読み取りに失敗しました。");
234
+
235
+ }
236
+
237
+
238
+
239
+
240
+
241
+ /*
242
+
243
+ アルファベット辞書順に並び変えて出力
244
+
245
+ 条件
246
+
247
+ * - "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)  
248
+
249
+ * - 単数形と複数形のように少しでも文字列が異れば別単語として扱う("dream"と"dreams"は別単語)
250
+
251
+ * - アポストロフィーやハイフン付の単語は1単語として扱う("isn't"や"dead-end")
252
+
253
+ */
254
+
255
+
256
+
257
+ List<String> list = new ArrayList<>();
258
+
259
+ int maxLengthOfSpelling = 0;
260
+
261
+
262
+
263
+ for (String key : map.keySet()) {
264
+
265
+ list.add(key);
266
+
267
+
268
+
269
+ if (maxLengthOfSpelling < key.length()) {
270
+
271
+ maxLengthOfSpelling = key.length();
272
+
273
+ }
274
+
275
+ }
276
+
277
+
278
+
279
+
280
+
281
+ /*
282
+
283
+ アルファベット順にソート
284
+
285
+ "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)
286
+
287
+ Comparatorインターフェースを用いた方法ではソートするための条件をプログラマが決めることができる。
288
+
289
+ 複雑な条件でのソートやオブジェクトの並び替えを特定のルールに沿って行いたいときは、この方法を用いる
290
+
291
+ */
292
+
293
+ Collections.sort(list, new Comparator<String>() {
78
294
 
79
295
  @Override
80
296
 
@@ -86,32 +302,52 @@
86
302
 
87
303
  });
88
304
 
305
+
306
+
307
+
308
+
89
-
309
+ /*
310
+
90
-
311
+ どこかのタイミングで 格納されているiを見つけ出し、
312
+
91
-
313
+ toUpperCaseメソッドで、小文字を大文字に変換すると解決する。
314
+
92
-
315
+ */
316
+
317
+ System.out.println("iのインデックスは" + list.indexOf("i") + "です");
318
+
319
+ System.out.println("後ろから調べたiのインデックスは"+list.lastIndexOf("i"));
320
+
321
+ // list.set(list.indexOf("i"), "I");
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+ // 全部の値を出力
330
+
331
+ String format = "%-" + maxLengthOfSpelling + "s= %3d";
332
+
333
+ for (String word : list) {
334
+
335
+
336
+
337
+ int count = map.get(word);
338
+
339
+ //出力の回数を制限するなら、ここで if (出現させたい件数 <= count)で可能
340
+
341
+ System.out.printf(format, word, count);
342
+
93
- System.out.println(foo);
343
+ System.out.println();
344
+
345
+
346
+
347
+ }
94
348
 
95
349
  }
96
350
 
351
+ }
352
+
97
353
  ```
98
-
99
-
100
-
101
- このような書き方で
102
-
103
- ソートするための条件を組んでみたのですがうまくいきません。
104
-
105
- ご指導のほどよろしくお願いします…。
106
-
107
-
108
-
109
-
110
-
111
- 試していること
112
-
113
- まずIを区別する前に
114
-
115
- リスト内をすべて、小文字に変換(toLowerCase();)したうえで、
116
-
117
- 特定の文字、Iだけを大文字にすればよいと考えております。

4

ソースの修正

2020/07/02 05:26

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -103,3 +103,15 @@
103
103
  ソートするための条件を組んでみたのですがうまくいきません。
104
104
 
105
105
  ご指導のほどよろしくお願いします…。
106
+
107
+
108
+
109
+
110
+
111
+ 試していること
112
+
113
+ まずIを区別する前に
114
+
115
+ リスト内をすべて、小文字に変換(toLowerCase();)したうえで、
116
+
117
+ 特定の文字、Iだけを大文字にすればよいと考えております。

3

ソースの修正

2020/07/02 04:26

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -6,25 +6,39 @@
6
6
 
7
7
  以下のような問題点がございます。
8
8
 
9
+
10
+
11
+
12
+
9
- ①特定の文字”A以外は小文字として扱うようにしたい。
13
+ ①特定の文字”I”以外は小文字として扱うようにしたい。
10
14
 
11
15
  例:Whyとwhyは同じく”why”として扱う。
12
16
 
13
17
 
14
18
 
15
- A
19
+ 【現在の表示
16
20
 
17
- B
21
+ highest = 1
18
22
 
19
- C
23
+ I = 3
20
24
 
21
- (省略)
25
+ if = 1
22
26
 
23
- a
27
+ If = 1
24
28
 
25
- b
26
29
 
30
+
27
- c
31
+ これを
32
+
33
+ I はそのまま
34
+
35
+ ifは Ifとifで2つとしてカウント
36
+
37
+ 【行いたい表示方法
38
+
39
+ I=3
40
+
41
+ if=2 としてカウントしてほしいです。
28
42
 
29
43
 
30
44
 
@@ -46,13 +60,13 @@
46
60
 
47
61
 
48
62
 
49
- foo.add("Abs");
63
+ foo.add("highest");
50
64
 
51
- foo.add("aaa");
65
+ foo.add("if");
52
66
 
53
- foo.add("bbb");
67
+ foo.add("If");
54
68
 
55
- foo.add("BBB");
69
+ foo.add("I");
56
70
 
57
71
  foo.add("Add");
58
72
 

2

ソースの修正

2020/07/02 04:13

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -58,25 +58,23 @@
58
58
 
59
59
 
60
60
 
61
- Collections.sort(
62
61
 
63
- foo,
64
62
 
65
- new Comparator<String>() {
63
+ Collections.sort(foo, new Comparator<String>() {
66
64
 
67
- @Override
65
+ @Override
68
66
 
69
- public String compare(String obj1, String obj2) {
67
+ public int compare(String s1, String s2) {
70
68
 
71
- return obj2 - obj1;
69
+ return s1.compareToIgnoreCase(s2);
72
-
73
- }
74
70
 
75
71
  }
76
72
 
77
- );
73
+ });
78
74
 
79
-
75
+
76
+
77
+
80
78
 
81
79
  System.out.println(foo);
82
80
 

1

ソースの修正

2020/07/02 04:08

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  public static void main(String[] args) {
44
44
 
45
- ArrayList<Integer> foo = new ArrayList<>();
45
+ ArrayList<String> foo = new ArrayList<>();
46
46
 
47
47
 
48
48
 
@@ -66,7 +66,7 @@
66
66
 
67
67
  @Override
68
68
 
69
- public int compare(String obj1, String obj2) {
69
+ public String compare(String obj1, String obj2) {
70
70
 
71
71
  return obj2 - obj1;
72
72