回答編集履歴

3

表現修正

2022/01/06 13:42

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  そして、 cord.txt ファイル全体に相当し、 Cord オブジェクトのリストを保持するクラスを作ります。
56
56
 
57
- 現状ではファイルからこのクラスを生成するため、 static な create メソッドで、 BufferedReader から自身をできるようにしています。パラメータが BufferedReader なのは、読み込み元を限定せず必要最小限にするためです。
57
+ 現状ではファイルからこのオブジェを生成するため、 static な create メソッドで、 BufferedReader から自身をるようにしています。パラメータが BufferedReader なのは、読み込み元を限定せず必要最小限にするためです。
58
58
 
59
59
  このクラスに対して行いたい処理である、 Cord オブジェクトを探して返すメソッドや、ファイルの形式で文字列化するメソッドも用意します。
60
60
 

2

コード等追加

2022/01/06 13:42

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -9,3 +9,161 @@
9
9
  複数データを改行で区切って一つの String にするという扱いは、一般的では無いと思います。
10
10
 
11
11
  配列やリスト等、複数のデータを『複数のまま』保持する構造を勉強されては如何でしょうか。
12
+
13
+
14
+
15
+ ----
16
+
17
+ 例えば以下のようなクラスを用意します。 cord ファイルの一行に当たるデータクラスです。
18
+
19
+ 各フィールドは変に変更されないよう final にした上で公開します。
20
+
21
+ データの単位をクラス化することで、それぞれの意味を名前や構造から伝える/知ることが出来ます。
22
+
23
+ ```java
24
+
25
+ class Cord {
26
+
27
+ final String code, country, city;
28
+
29
+
30
+
31
+ Cord(String code, String country, String city) {
32
+
33
+ this.code = code;
34
+
35
+ this.country = country;
36
+
37
+ this.city = city;
38
+
39
+ }
40
+
41
+
42
+
43
+ @Override
44
+
45
+ public String toString() {
46
+
47
+ return code + "," + country + "," + city;
48
+
49
+ }
50
+
51
+ }
52
+
53
+ ```
54
+
55
+ そして、 cord.txt ファイル全体に相当し、 Cord オブジェクトのリストを保持するクラスを作ります。
56
+
57
+ 現状ではファイルからこのクラスを生成するため、 static な create メソッドで、 BufferedReader から自身を生成できるようにしています。パラメータが BufferedReader なのは、読み込み元を限定せず必要最小限にするためです。
58
+
59
+ このクラスに対して行いたい処理である、 Cord オブジェクトを探して返すメソッドや、ファイルの形式で文字列化するメソッドも用意します。
60
+
61
+ ```java
62
+
63
+ class CordsData {
64
+
65
+ static CordsData create(BufferedReader br) throws IOException {
66
+
67
+ List<Cord> list = new ArrayList<>();
68
+
69
+ for(String line; (line = br.readLine()) != null;) {
70
+
71
+ String[] tokens = line.split(",");
72
+
73
+ if(tokens.length != 3) throw new IOException("format error. line='"+line+"'");
74
+
75
+ list.add(new Cord(tokens[0], tokens[1], tokens[2]));
76
+
77
+ }
78
+
79
+ return new CordsData(list);
80
+
81
+ }
82
+
83
+
84
+
85
+ private List<Cord> list;
86
+
87
+ CordsData(List<Cord> list) {
88
+
89
+ this.list = list;
90
+
91
+ }
92
+
93
+
94
+
95
+ Cord getCordByCode(String code) {
96
+
97
+ for(Cord cord : list) if(cord.code.equals(code)) return cord;
98
+
99
+ return null; //無かった
100
+
101
+ }
102
+
103
+
104
+
105
+ @Override
106
+
107
+ public String toString() {
108
+
109
+ StringJoiner sj = new StringJoiner("\n");
110
+
111
+ for(Cord cord : list) sj.add(cord.toString());
112
+
113
+ return sj.toString();
114
+
115
+ }
116
+
117
+ }
118
+
119
+ ```
120
+
121
+ このクラスによって、ファイルからの読み込みは以下のように書けます。
122
+
123
+ (try-with-resources 文 を使用することで finally や close を省いています)
124
+
125
+ ```java
126
+
127
+ private CordsData cordsData; //フィールドとして定義
128
+
129
+
130
+
131
+ try(InputStream is = getAssets().open("test1/cord.txt");
132
+
133
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));) {
134
+
135
+ cordsData = CordsData.create(br);
136
+
137
+ } catch (Exception e) {
138
+
139
+ e.printStackTrace();
140
+
141
+ finish(); //エラー発生時に前のアクティビティに戻る
142
+
143
+ }
144
+
145
+ ```
146
+
147
+ また、検索は CordData クラスのメソッドをそのまま使えます。
148
+
149
+ ```java
150
+
151
+ //一致するコードがあったら表示
152
+
153
+ Cord cord = cordsData.getCordByCode(text1);
154
+
155
+ if (cord != null) {
156
+
157
+ System.out.println("一致しました");
158
+
159
+ textView3.setText(cord.toString());
160
+
161
+ } else {
162
+
163
+ System.out.println("一致していません");
164
+
165
+ textView3.setText("一致していません");
166
+
167
+ }
168
+
169
+ ```

1

追記

2022/01/06 13:37

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -1,6 +1,8 @@
1
1
  プログラムは、データをどう扱うのかが核心です。
2
2
 
3
3
  ですので、データをどう保持するかも重要になります。
4
+
5
+ Android の入門書等では主に画面関係に焦点が当たり易いと思いますが、それ以前として、アプリとしてのデータの扱い方を知っている・分かっている必要があります。
4
6
 
5
7
 
6
8