回答編集履歴

1

完全版を追記

2020/04/26 16:06

投稿

xebme
xebme

スコア1090

test CHANGED
@@ -18,6 +18,8 @@
18
18
 
19
19
  fr.lines()
20
20
 
21
+ .filter(s -> !s.matches("^#.*")) // コメント除去
22
+
21
23
  .flatMap(s -> Stream.of(s.split(",+")))
22
24
 
23
25
  .filter(s -> !s.isEmpty())
@@ -58,7 +60,7 @@
58
60
 
59
61
  ```
60
62
 
61
- Streamを使ってみたけれど、whileでループさせてもほぼ同じコードになります。collectの部分は畳み込みです。
63
+ Streamを使ってみたけれど、whileでループさせてもほぼ同じコードになります。
62
64
 
63
65
 
64
66
 
@@ -91,3 +93,131 @@
91
93
  ```
92
94
 
93
95
  fillSpaceという関数が`""`を必要なだけ追加します。全体に冗長です。もっと簡潔に書けると思います。Streamを使う練習だと思ってチャレンジしてみてください。
96
+
97
+
98
+
99
+ ###
100
+
101
+ **完全版(追記)**
102
+
103
+
104
+
105
+ コメント行除去を追加しました。結果をList<List<String>>に変更。
106
+
107
+
108
+
109
+ ```Java
110
+
111
+ import java.io.BufferedReader;
112
+
113
+ import java.io.FileReader;
114
+
115
+ import java.io.IOException;
116
+
117
+ import java.util.ArrayDeque;
118
+
119
+ import java.util.Deque;
120
+
121
+ import java.util.LinkedHashSet;
122
+
123
+ import java.util.List;
124
+
125
+ import java.util.Set;
126
+
127
+ import java.util.stream.Collectors;
128
+
129
+ import java.util.stream.Stream;
130
+
131
+
132
+
133
+ public class SettingsToList {
134
+
135
+
136
+
137
+ static String FILE_NAME = "... /settings.txt";
138
+
139
+ static final int ARRAY_SIZE = 3;
140
+
141
+
142
+
143
+ public static void main(String[] args) {
144
+
145
+ Deque<Set<String>> list = readLines(FILE_NAME);
146
+
147
+ //list.forEach(System.out::println);
148
+
149
+ List<List<String>> result =
150
+
151
+ list.stream()
152
+
153
+ .map( r -> Stream.concat(
154
+
155
+ r.stream(),
156
+
157
+ Stream.iterate("", s -> s).limit(ARRAY_SIZE - r.size())
158
+
159
+ ).collect(Collectors.toList()))
160
+
161
+ .collect(Collectors.toList());
162
+
163
+ System.out.println(result);
164
+
165
+ }
166
+
167
+
168
+
169
+ static Deque<Set<String>> readLines(String fileName) {
170
+
171
+ Deque<Set<String>> result = null;
172
+
173
+ try (BufferedReader fr = new BufferedReader(new FileReader(fileName))) {
174
+
175
+ result =
176
+
177
+ fr.lines()
178
+
179
+ .filter(s -> !s.matches("^#.*")) // コメント除去
180
+
181
+ .flatMap(s -> Stream.of(s.split(",+")))
182
+
183
+ .filter(s -> !s.isEmpty())
184
+
185
+ .collect(
186
+
187
+ ArrayDeque<Set<String>>::new,
188
+
189
+ (acc, s) -> {
190
+
191
+ if (s.matches("^<.*$")) { // 行の開始
192
+
193
+ Set<String> hs = new LinkedHashSet<>();
194
+
195
+ hs.add(s.substring(1));
196
+
197
+ acc.addLast(hs);
198
+
199
+ } else if (!s.matches(".*>$")) {
200
+
201
+ (acc.getLast()).add(s); // 要素の追加、重複除去
202
+
203
+ }
204
+
205
+ },
206
+
207
+ Deque::addAll);
208
+
209
+ } catch (IOException e) {
210
+
211
+ e.printStackTrace();
212
+
213
+ }
214
+
215
+ return result;
216
+
217
+ }
218
+
219
+ }
220
+
221
+ ```
222
+
223
+ Streamを使う意義はご自分で考えてください。