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

質問編集履歴

7

ミスがありました

2020/07/02 22:13

投稿

tapipi
tapipi

スコア13

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

タイトルをかえました

2020/07/02 22:13

投稿

tapipi
tapipi

スコア13

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

5

わかりやすくしました

2020/07/02 22:03

投稿

tapipi
tapipi

スコア13

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
- 例:Whyとwhyは同じく”why”として扱う。
11
+ またリスト内に含まれる「i」を検索して
12
+ 大文字に変える方法はございませんか?
9
13
 
10
- 【現在の表示
14
+ ```
11
- highest = 1
15
+ iのインデックスは53です
12
- I = 3
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
- ```java
34
+ */
29
- public static void main(String[] args) {
35
+ private static InputStream openDataFile() {
36
+ //getResourceAsStreamメソッドを利用すると、リソースファイル(設定ファイルなどのこと)を簡単に読み込むことができる
30
- ArrayList<String> foo = new ArrayList<>();
37
+ return Q003.class.getResourceAsStream("data.txt");
31
-
32
- foo.add("highest");
33
- foo.add("if");
34
- foo.add("If");
35
- foo.add("I");
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(foo, new Comparator<String>() {
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
- まずI区別する前に
165
+ // 全部の値出力
166
+ String format = "%-" + maxLengthOfSpelling + "s= %3d";
167
+ for (String word : list) {
168
+
169
+ int count = map.get(word);
170
+ //出力の回数を制限するなら、ここで if (出現させたい件数 <= count)で可能
58
- リスト内をすべて、小文字に変換(toLowerCase();)したうえで、
171
+ System.out.printf(format, word, count);
59
- 特定の文字、Iだけを大文字にすればよいと考えております。
172
+ System.out.println();
173
+
174
+ }
175
+ }
176
+ }
177
+ ```

4

ソースの修正

2020/07/02 05:26

投稿

tapipi
tapipi

スコア13

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

ソースの修正

2020/07/02 04:26

投稿

tapipi
tapipi

スコア13

title CHANGED
File without changes
body CHANGED
@@ -2,18 +2,25 @@
2
2
 
3
3
  現在以下のように出力されており
4
4
  以下のような問題点がございます。
5
+
6
+
5
- ①特定の文字”A以外は小文字として扱うようにしたい。
7
+ ①特定の文字”I”以外は小文字として扱うようにしたい。
6
8
  例:Whyとwhyは同じく”why”として扱う。
7
9
 
8
- A
9
- B
10
- C
11
- (省略)
10
+ 【現在の表示
12
- a
11
+ highest = 1
13
- b
12
+ I = 3
14
- c
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("Abs");
33
+ foo.add("if");
26
- foo.add("aaa");
34
+ foo.add("If");
27
- foo.add("bbb");
35
+ foo.add("I");
28
- foo.add("BBB");
29
36
  foo.add("Add");
30
37
 
31
38
 

2

ソースの修正

2020/07/02 04:13

投稿

tapipi
tapipi

スコア13

title CHANGED
File without changes
body CHANGED
@@ -28,16 +28,15 @@
28
28
  foo.add("BBB");
29
29
  foo.add("Add");
30
30
 
31
- Collections.sort(
31
+
32
- foo,
33
- new Comparator<String>() {
32
+ Collections.sort(foo, new Comparator<String>() {
34
- @Override
33
+ @Override
35
- public String compare(String obj1, String obj2) {
34
+ public int compare(String s1, String s2) {
36
- return obj2 - obj1;
35
+ return s1.compareToIgnoreCase(s2);
37
- }
38
36
  }
39
- );
37
+ });
40
-
38
+
39
+
41
40
  System.out.println(foo);
42
41
  }
43
42
  ```

1

ソースの修正

2020/07/02 04:08

投稿

tapipi
tapipi

スコア13

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<Integer> foo = new 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 int compare(String obj1, String obj2) {
35
+ public String compare(String obj1, String obj2) {
36
36
  return obj2 - obj1;
37
37
  }
38
38
  }