質問編集履歴
7
ミスがありました
title
CHANGED
File without changes
|
body
CHANGED
@@ -9,169 +9,4 @@
|
|
9
9
|
どうしたら53番目の値を変更できますか?
|
10
10
|
|
11
11
|
またリスト内に含まれる「i」を検索して、
|
12
|
-
大文字に変える方法はございませんか?
|
12
|
+
大文字に変える方法はございませんか?
|
13
|
-
|
14
|
-
```
|
15
|
-
iのインデックスは53です
|
16
|
-
後ろから調べたiのインデックスは53
|
17
|
-
|
18
|
-
```
|
19
|
-
|
20
|
-
### 該当のソースコード
|
21
|
-
|
22
|
-
```java
|
23
|
-
|
24
|
-
import java.io.*;
|
25
|
-
import java.util.*;
|
26
|
-
public class Q {
|
27
|
-
|
28
|
-
// 「1つ以上のスペース、ピリオド、コンマ、セミコロンのどれか」という意味
|
29
|
-
// |は区切ったもののどれかという意味で、.は単にピリオドです(文字列表記する都合上、バックスラッシュが2つ必要)
|
30
|
-
private static final String SEPARATOR = "(\s+?|\.|,|;)";
|
31
|
-
/**
|
32
|
-
* データファイルを開く
|
33
|
-
* resources/q003/data.txt
|
34
|
-
*/
|
35
|
-
private static InputStream openDataFile() {
|
36
|
-
//getResourceAsStreamメソッドを利用すると、リソースファイル(設定ファイルなどのこと)を簡単に読み込むことができる
|
37
|
-
return Q003.class.getResourceAsStream("data.txt");
|
38
|
-
}
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
public static void main(String[] args){
|
43
|
-
|
44
|
-
// 集計
|
45
|
-
//カウントには以下のMap<String, Integer>を使用
|
46
|
-
Map<String, Integer> map = new HashMap<>();
|
47
|
-
try (
|
48
|
-
/*
|
49
|
-
ファイルの読み込み main配下にあるresourcesからファイルを取得している
|
50
|
-
FileReaderを使ってファイルを読み込む場合には、1文字読み込んでは1文字処理して、と言うのを繰り返すため、非常に効率が悪い
|
51
|
-
*/
|
52
|
-
FileReader fr = new FileReader(Q003.class.getResource("data.txt").getFile());
|
53
|
-
|
54
|
-
/*
|
55
|
-
ファイルの読み込み
|
56
|
-
なぜ最初からこのクラスを使わないかというと、このクラスはFileReaderクラスを拡張する形で利用するため。
|
57
|
-
FileReaderクラスの持つ基本機能でファイルから読み込みは行うが、
|
58
|
-
それにBufferedReaderクラスをかぶせて使うことでまとめて読み込む機能を持てるようになる
|
59
|
-
*/
|
60
|
-
BufferedReader br = new BufferedReader(fr)){
|
61
|
-
|
62
|
-
/*
|
63
|
-
テキストを1行単位で読む
|
64
|
-
1行まとめて読むための"readLine"メソッドが用意されている。
|
65
|
-
注意する点は、改行文字は読み込んだ文字に含まれない事
|
66
|
-
よって1行ごとに、改行を含まないテキストを読み込んでString型の値として返す
|
67
|
-
*/
|
68
|
-
String line;
|
69
|
-
//テキストファイルの読み取りの箇所ではreadLine()で行を取得
|
70
|
-
while ((line = br.readLine()) != null) {
|
71
|
-
|
72
|
-
/*
|
73
|
-
全て大文字に変換する。
|
74
|
-
*/
|
75
|
-
String resultline = line.toLowerCase();
|
76
|
-
|
77
|
-
//splitメソッドでword[]に分割して格納していく。
|
78
|
-
String[] words = resultline.split(SEPARATOR);
|
79
|
-
|
80
|
-
//繰り返し処理
|
81
|
-
for (String word : words) {
|
82
|
-
//もしwordがからでないなら… 文字列が空かどうかを判定する – isEmptyメソッド
|
83
|
-
//分解後に空白1文字が残る場合に備え、単語の出現数のカウントではisEmpty()メソッドを使用
|
84
|
-
if (!word.isEmpty()) {
|
85
|
-
|
86
|
-
|
87
|
-
/*
|
88
|
-
containsKeyメソッドは、指定したキーが存在するか確認を行い、キーが存在する場合は「true」を返します
|
89
|
-
Map.containsKey(検索するキー)
|
90
|
-
|
91
|
-
キー→単語
|
92
|
-
値 →出現数
|
93
|
-
|
94
|
-
単語wordが与えられたときの処理は以下の考え方。
|
95
|
-
単語がMapのキーに含まれている場合、出現数を加算する。
|
96
|
-
単語がMapのキーに含まれていない場合、以下をMapに格納する。
|
97
|
-
キー word
|
98
|
-
値 1
|
99
|
-
*/
|
100
|
-
if (map.containsKey(word)) {
|
101
|
-
/*
|
102
|
-
要素を取り出すためにgetメソッドを使用する。 get(Object key)
|
103
|
-
要素を格納するためにputメソッドを使用する。 put(K key, V value)
|
104
|
-
*/
|
105
|
-
int count = map.get(word) + 1;
|
106
|
-
map.put(word, count);
|
107
|
-
} else {
|
108
|
-
map.put(word, 1);
|
109
|
-
}
|
110
|
-
}
|
111
|
-
}
|
112
|
-
|
113
|
-
}
|
114
|
-
} catch (FileNotFoundException e) {
|
115
|
-
System.out.println("ファイルが見つかりませんでした。");
|
116
|
-
} catch (IOException e) {
|
117
|
-
System.out.println("読み取りに失敗しました。");
|
118
|
-
}
|
119
|
-
|
120
|
-
|
121
|
-
/*
|
122
|
-
アルファベット辞書順に並び変えて出力
|
123
|
-
条件
|
124
|
-
* - "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)
|
125
|
-
* - 単数形と複数形のように少しでも文字列が異れば別単語として扱う("dream"と"dreams"は別単語)
|
126
|
-
* - アポストロフィーやハイフン付の単語は1単語として扱う("isn't"や"dead-end")
|
127
|
-
*/
|
128
|
-
|
129
|
-
List<String> list = new ArrayList<>();
|
130
|
-
int maxLengthOfSpelling = 0;
|
131
|
-
|
132
|
-
for (String key : map.keySet()) {
|
133
|
-
list.add(key);
|
134
|
-
|
135
|
-
if (maxLengthOfSpelling < key.length()) {
|
136
|
-
maxLengthOfSpelling = key.length();
|
137
|
-
}
|
138
|
-
}
|
139
|
-
|
140
|
-
|
141
|
-
/*
|
142
|
-
アルファベット順にソート
|
143
|
-
"I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)
|
144
|
-
Comparatorインターフェースを用いた方法ではソートするための条件をプログラマが決めることができる。
|
145
|
-
複雑な条件でのソートやオブジェクトの並び替えを特定のルールに沿って行いたいときは、この方法を用いる
|
146
|
-
*/
|
147
|
-
Collections.sort(list, new Comparator<String>() {
|
148
|
-
@Override
|
149
|
-
public int compare(String s1, String s2) {
|
150
|
-
return s1.compareToIgnoreCase(s2);
|
151
|
-
}
|
152
|
-
});
|
153
|
-
|
154
|
-
|
155
|
-
/*
|
156
|
-
どこかのタイミングで 格納されているiを見つけ出し、
|
157
|
-
toUpperCaseメソッドで、小文字を大文字に変換すると解決する。
|
158
|
-
*/
|
159
|
-
System.out.println("iのインデックスは" + list.indexOf("i") + "です");
|
160
|
-
System.out.println("後ろから調べたiのインデックスは"+list.lastIndexOf("i"));
|
161
|
-
// list.set(list.indexOf("i"), "I");
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
// 全部の値を出力
|
166
|
-
String format = "%-" + maxLengthOfSpelling + "s= %3d";
|
167
|
-
for (String word : list) {
|
168
|
-
|
169
|
-
int count = map.get(word);
|
170
|
-
//出力の回数を制限するなら、ここで if (出現させたい件数 <= count)で可能
|
171
|
-
System.out.printf(format, word, count);
|
172
|
-
System.out.println();
|
173
|
-
|
174
|
-
}
|
175
|
-
}
|
176
|
-
}
|
177
|
-
```
|
6
タイトルをかえました
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
位置の値を変更したい
|
body
CHANGED
File without changes
|
5
わかりやすくしました
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
特定の
|
1
|
+
Listの特定の位置の値を変更したい
|
body
CHANGED
@@ -1,59 +1,177 @@
|
|
1
|
-
|
1
|
+
### 前提・実現したいこと
|
2
2
|
|
3
|
-
|
3
|
+
list.set(list.indexOf("i"), "I");
|
4
|
-
|
4
|
+
を使用して、53番目の位置の値を変更したい。
|
5
5
|
|
6
|
+
ですが、エラー
|
7
|
+
Exception in thread "main" java.lang.NullPointerException
|
8
|
+
と指定した場所がありませんと表示されます…。
|
9
|
+
どうしたら53番目の値を変更できますか?
|
6
10
|
|
7
|
-
①特定の文字”I”以外は小文字として扱うようにしたい。
|
8
|
-
|
11
|
+
またリスト内に含まれる「i」を検索して、
|
12
|
+
大文字に変える方法はございませんか?
|
9
13
|
|
10
|
-
|
14
|
+
```
|
11
|
-
|
15
|
+
iのインデックスは53です
|
12
|
-
|
16
|
+
後ろから調べたiのインデックスは53
|
13
|
-
if = 1
|
14
|
-
If = 1
|
15
17
|
|
16
|
-
|
18
|
+
```
|
17
|
-
I はそのまま
|
18
|
-
ifは Ifとifで2つとしてカウント
|
19
|
-
【行いたい表示方法
|
20
|
-
I=3
|
21
|
-
if=2 としてカウントしてほしいです。
|
22
19
|
|
20
|
+
### 該当のソースコード
|
23
21
|
|
24
|
-
|
22
|
+
```java
|
25
|
-
Comparatorインターフェースを用いた方法で、ソートするための条件を組めばよいと考えております。
|
26
23
|
|
24
|
+
import java.io.*;
|
25
|
+
import java.util.*;
|
26
|
+
public class Q {
|
27
27
|
|
28
|
+
// 「1つ以上のスペース、ピリオド、コンマ、セミコロンのどれか」という意味
|
29
|
+
// |は区切ったもののどれかという意味で、.は単にピリオドです(文字列表記する都合上、バックスラッシュが2つ必要)
|
30
|
+
private static final String SEPARATOR = "(\s+?|\.|,|;)";
|
31
|
+
/**
|
32
|
+
* データファイルを開く
|
33
|
+
* resources/q003/data.txt
|
28
|
-
|
34
|
+
*/
|
29
|
-
|
35
|
+
private static InputStream openDataFile() {
|
36
|
+
//getResourceAsStreamメソッドを利用すると、リソースファイル(設定ファイルなどのこと)を簡単に読み込むことができる
|
30
|
-
|
37
|
+
return Q003.class.getResourceAsStream("data.txt");
|
31
|
-
|
32
|
-
foo.add("highest");
|
33
|
-
foo.add("if");
|
34
|
-
foo.add("If");
|
35
|
-
|
38
|
+
}
|
36
|
-
foo.add("Add");
|
37
|
-
|
38
39
|
|
40
|
+
|
41
|
+
|
42
|
+
public static void main(String[] args){
|
43
|
+
|
44
|
+
// 集計
|
45
|
+
//カウントには以下のMap<String, Integer>を使用
|
46
|
+
Map<String, Integer> map = new HashMap<>();
|
47
|
+
try (
|
48
|
+
/*
|
49
|
+
ファイルの読み込み main配下にあるresourcesからファイルを取得している
|
50
|
+
FileReaderを使ってファイルを読み込む場合には、1文字読み込んでは1文字処理して、と言うのを繰り返すため、非常に効率が悪い
|
51
|
+
*/
|
52
|
+
FileReader fr = new FileReader(Q003.class.getResource("data.txt").getFile());
|
53
|
+
|
54
|
+
/*
|
55
|
+
ファイルの読み込み
|
56
|
+
なぜ最初からこのクラスを使わないかというと、このクラスはFileReaderクラスを拡張する形で利用するため。
|
57
|
+
FileReaderクラスの持つ基本機能でファイルから読み込みは行うが、
|
58
|
+
それにBufferedReaderクラスをかぶせて使うことでまとめて読み込む機能を持てるようになる
|
59
|
+
*/
|
60
|
+
BufferedReader br = new BufferedReader(fr)){
|
61
|
+
|
62
|
+
/*
|
63
|
+
テキストを1行単位で読む
|
64
|
+
1行まとめて読むための"readLine"メソッドが用意されている。
|
65
|
+
注意する点は、改行文字は読み込んだ文字に含まれない事
|
66
|
+
よって1行ごとに、改行を含まないテキストを読み込んでString型の値として返す
|
67
|
+
*/
|
68
|
+
String line;
|
69
|
+
//テキストファイルの読み取りの箇所ではreadLine()で行を取得
|
70
|
+
while ((line = br.readLine()) != null) {
|
71
|
+
|
72
|
+
/*
|
73
|
+
全て大文字に変換する。
|
74
|
+
*/
|
75
|
+
String resultline = line.toLowerCase();
|
76
|
+
|
77
|
+
//splitメソッドでword[]に分割して格納していく。
|
78
|
+
String[] words = resultline.split(SEPARATOR);
|
79
|
+
|
80
|
+
//繰り返し処理
|
81
|
+
for (String word : words) {
|
82
|
+
//もしwordがからでないなら… 文字列が空かどうかを判定する – isEmptyメソッド
|
83
|
+
//分解後に空白1文字が残る場合に備え、単語の出現数のカウントではisEmpty()メソッドを使用
|
84
|
+
if (!word.isEmpty()) {
|
85
|
+
|
86
|
+
|
87
|
+
/*
|
88
|
+
containsKeyメソッドは、指定したキーが存在するか確認を行い、キーが存在する場合は「true」を返します
|
89
|
+
Map.containsKey(検索するキー)
|
90
|
+
|
91
|
+
キー→単語
|
92
|
+
値 →出現数
|
93
|
+
|
94
|
+
単語wordが与えられたときの処理は以下の考え方。
|
95
|
+
単語がMapのキーに含まれている場合、出現数を加算する。
|
96
|
+
単語がMapのキーに含まれていない場合、以下をMapに格納する。
|
97
|
+
キー word
|
98
|
+
値 1
|
99
|
+
*/
|
100
|
+
if (map.containsKey(word)) {
|
101
|
+
/*
|
102
|
+
要素を取り出すためにgetメソッドを使用する。 get(Object key)
|
103
|
+
要素を格納するためにputメソッドを使用する。 put(K key, V value)
|
104
|
+
*/
|
105
|
+
int count = map.get(word) + 1;
|
106
|
+
map.put(word, count);
|
107
|
+
} else {
|
108
|
+
map.put(word, 1);
|
109
|
+
}
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
}
|
114
|
+
} catch (FileNotFoundException e) {
|
115
|
+
System.out.println("ファイルが見つかりませんでした。");
|
116
|
+
} catch (IOException e) {
|
117
|
+
System.out.println("読み取りに失敗しました。");
|
118
|
+
}
|
119
|
+
|
120
|
+
|
121
|
+
/*
|
122
|
+
アルファベット辞書順に並び変えて出力
|
123
|
+
条件
|
124
|
+
* - "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)
|
125
|
+
* - 単数形と複数形のように少しでも文字列が異れば別単語として扱う("dream"と"dreams"は別単語)
|
126
|
+
* - アポストロフィーやハイフン付の単語は1単語として扱う("isn't"や"dead-end")
|
127
|
+
*/
|
128
|
+
|
129
|
+
List<String> list = new ArrayList<>();
|
130
|
+
int maxLengthOfSpelling = 0;
|
131
|
+
|
132
|
+
for (String key : map.keySet()) {
|
133
|
+
list.add(key);
|
134
|
+
|
135
|
+
if (maxLengthOfSpelling < key.length()) {
|
136
|
+
maxLengthOfSpelling = key.length();
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
|
141
|
+
/*
|
142
|
+
アルファベット順にソート
|
143
|
+
"I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)
|
144
|
+
Comparatorインターフェースを用いた方法ではソートするための条件をプログラマが決めることができる。
|
145
|
+
複雑な条件でのソートやオブジェクトの並び替えを特定のルールに沿って行いたいときは、この方法を用いる
|
146
|
+
*/
|
39
|
-
Collections.sort(
|
147
|
+
Collections.sort(list, new Comparator<String>() {
|
40
148
|
@Override
|
41
149
|
public int compare(String s1, String s2) {
|
42
150
|
return s1.compareToIgnoreCase(s2);
|
43
151
|
}
|
44
152
|
});
|
45
|
-
|
46
|
-
|
47
|
-
System.out.println(foo);
|
48
|
-
}
|
49
|
-
```
|
50
153
|
|
51
|
-
このような書き方で
|
52
|
-
ソートするための条件を組んでみたのですがうまくいきません。
|
53
|
-
ご指導のほどよろしくお願いします…。
|
54
154
|
|
155
|
+
/*
|
156
|
+
どこかのタイミングで 格納されているiを見つけ出し、
|
157
|
+
toUpperCaseメソッドで、小文字を大文字に変換すると解決する。
|
158
|
+
*/
|
159
|
+
System.out.println("iのインデックスは" + list.indexOf("i") + "です");
|
160
|
+
System.out.println("後ろから調べたiのインデックスは"+list.lastIndexOf("i"));
|
161
|
+
// list.set(list.indexOf("i"), "I");
|
55
162
|
|
56
|
-
|
163
|
+
|
164
|
+
|
57
|
-
|
165
|
+
// 全部の値を出力
|
166
|
+
String format = "%-" + maxLengthOfSpelling + "s= %3d";
|
167
|
+
for (String word : list) {
|
168
|
+
|
169
|
+
int count = map.get(word);
|
170
|
+
//出力の回数を制限するなら、ここで if (出現させたい件数 <= count)で可能
|
58
|
-
|
171
|
+
System.out.printf(format, word, count);
|
59
|
-
|
172
|
+
System.out.println();
|
173
|
+
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
```
|
4
ソースの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -50,4 +50,10 @@
|
|
50
50
|
|
51
51
|
このような書き方で
|
52
52
|
ソートするための条件を組んでみたのですがうまくいきません。
|
53
|
-
ご指導のほどよろしくお願いします…。
|
53
|
+
ご指導のほどよろしくお願いします…。
|
54
|
+
|
55
|
+
|
56
|
+
試していること
|
57
|
+
まずIを区別する前に
|
58
|
+
リスト内をすべて、小文字に変換(toLowerCase();)したうえで、
|
59
|
+
特定の文字、Iだけを大文字にすればよいと考えております。
|
3
ソースの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,18 +2,25 @@
|
|
2
2
|
|
3
3
|
現在以下のように出力されており
|
4
4
|
以下のような問題点がございます。
|
5
|
+
|
6
|
+
|
5
|
-
①特定の文字”
|
7
|
+
①特定の文字”I”以外は小文字として扱うようにしたい。
|
6
8
|
例:Whyとwhyは同じく”why”として扱う。
|
7
9
|
|
8
|
-
A
|
9
|
-
B
|
10
|
-
C
|
11
|
-
|
10
|
+
【現在の表示
|
12
|
-
|
11
|
+
highest = 1
|
13
|
-
|
12
|
+
I = 3
|
14
|
-
|
13
|
+
if = 1
|
14
|
+
If = 1
|
15
15
|
|
16
|
+
これを
|
17
|
+
I はそのまま
|
18
|
+
ifは Ifとifで2つとしてカウント
|
19
|
+
【行いたい表示方法
|
20
|
+
I=3
|
21
|
+
if=2 としてカウントしてほしいです。
|
16
22
|
|
23
|
+
|
17
24
|
考えているのは、
|
18
25
|
Comparatorインターフェースを用いた方法で、ソートするための条件を組めばよいと考えております。
|
19
26
|
|
@@ -22,10 +29,10 @@
|
|
22
29
|
public static void main(String[] args) {
|
23
30
|
ArrayList<String> foo = new ArrayList<>();
|
24
31
|
|
32
|
+
foo.add("highest");
|
25
|
-
foo.add("
|
33
|
+
foo.add("if");
|
26
|
-
foo.add("
|
34
|
+
foo.add("If");
|
27
|
-
foo.add("
|
35
|
+
foo.add("I");
|
28
|
-
foo.add("BBB");
|
29
36
|
foo.add("Add");
|
30
37
|
|
31
38
|
|
2
ソースの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -28,16 +28,15 @@
|
|
28
28
|
foo.add("BBB");
|
29
29
|
foo.add("Add");
|
30
30
|
|
31
|
-
|
31
|
+
|
32
|
-
foo,
|
33
|
-
|
32
|
+
Collections.sort(foo, new Comparator<String>() {
|
34
|
-
|
33
|
+
@Override
|
35
|
-
|
34
|
+
public int compare(String s1, String s2) {
|
36
|
-
|
35
|
+
return s1.compareToIgnoreCase(s2);
|
37
|
-
}
|
38
36
|
}
|
39
|
-
);
|
37
|
+
});
|
40
|
-
|
38
|
+
|
39
|
+
|
41
40
|
System.out.println(foo);
|
42
41
|
}
|
43
42
|
```
|
1
ソースの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
```java
|
22
22
|
public static void main(String[] args) {
|
23
|
-
ArrayList<
|
23
|
+
ArrayList<String> foo = new ArrayList<>();
|
24
24
|
|
25
25
|
foo.add("Abs");
|
26
26
|
foo.add("aaa");
|
@@ -32,7 +32,7 @@
|
|
32
32
|
foo,
|
33
33
|
new Comparator<String>() {
|
34
34
|
@Override
|
35
|
-
public
|
35
|
+
public String compare(String obj1, String obj2) {
|
36
36
|
return obj2 - obj1;
|
37
37
|
}
|
38
38
|
}
|