回答編集履歴

1

全愛知を追加、クラス構成を変更

2020/11/26 06:33

投稿

xebme
xebme

スコア1090

test CHANGED
@@ -1,3 +1,15 @@
1
+ **figure1/figure2の仮定**
2
+
3
+
4
+
5
+ figure2のインスタンスを用意しているので、figure1はシャッフルしないで元のまま残す、と仮定します。
6
+
7
+
8
+
9
+ ---
10
+
11
+
12
+
1
13
  **figure2**
2
14
 
3
15
 
@@ -40,7 +52,7 @@
40
52
 
41
53
 
42
54
 
43
- 複製とシャッフル行うメソッドを書くとすれば次のようになります。
55
+ 複製とシャッフル行うメソッドを書くとすれば次のようになります。
44
56
 
45
57
 
46
58
 
@@ -109,3 +121,165 @@
109
121
  }
110
122
 
111
123
  ```
124
+
125
+
126
+
127
+ ---
128
+
129
+
130
+
131
+ **シャッフル別解**
132
+
133
+
134
+
135
+ 質問に対する[追記・修正依頼]で指摘した方法です。これは難しくなります。バグがあるかもしれません。
136
+
137
+
138
+
139
+ figure2の初期化。
140
+
141
+
142
+
143
+ ```Java
144
+
145
+ Figure [] figures2 = new Figure[figures1.length];
146
+
147
+ ```
148
+
149
+
150
+
151
+ シャッフル。
152
+
153
+
154
+
155
+ ```Java
156
+
157
+ Random rnd = ThreadLocalRandom.current();
158
+
159
+ for (int k = figures1.length; k > 0;) {
160
+
161
+ int index = rnd.nextInt(k);
162
+
163
+ temp = (figures2[index] == null) ? figures1[index] : figures2[index];
164
+
165
+ if (index != --k) {
166
+
167
+ figures2[index] = (figures2[k] == null) ? figures1[k] : figures2[k];
168
+
169
+ }
170
+
171
+ figures2[k] = temp;
172
+
173
+ }
174
+
175
+ ```
176
+
177
+
178
+
179
+ ---
180
+
181
+
182
+
183
+ **クラス名にインスタンス番号をつける**
184
+
185
+
186
+
187
+ カウンターをスレッドセーフにするために`java.util.concurrent.atomic.AtomicInteger`を使います。int型のcounterを使用すると`++counter`は2命令になりアトミックではないため。クラス構成にかなり問題がありましたので大幅に手直ししました。
188
+
189
+
190
+
191
+ ```Java
192
+
193
+ abstract class Figure {
194
+
195
+
196
+
197
+ final String name;
198
+
199
+
200
+
201
+ public Figure(String name) {
202
+
203
+ this.name = name;
204
+
205
+ }
206
+
207
+
208
+
209
+ abstract double getArea();
210
+
211
+
212
+
213
+ @Override
214
+
215
+ public String toString() {
216
+
217
+ return name + ":" + String.format("%.1f", getArea());
218
+
219
+ }
220
+
221
+
222
+
223
+ }
224
+
225
+ ```
226
+
227
+
228
+
229
+ Rectangleクラス
230
+
231
+
232
+
233
+ ```Java
234
+
235
+ class Rectangle extends Figure {
236
+
237
+
238
+
239
+ static final String NAME = Rectangle.class.getSimpleName();
240
+
241
+ static final java.util.concurrent.atomic.AtomicInteger counter = new AtomicInteger(0);
242
+
243
+ final int width;
244
+
245
+ final int height;
246
+
247
+
248
+
249
+ Rectangle() {
250
+
251
+ this(10, 20);
252
+
253
+ }
254
+
255
+
256
+
257
+ Rectangle(int width, int height) {
258
+
259
+ super(NAME + counter.addAndGet(1));
260
+
261
+ this.width = width;
262
+
263
+ this.height = height;
264
+
265
+ }
266
+
267
+
268
+
269
+ @Override
270
+
271
+ double getArea() {
272
+
273
+ return width * height;
274
+
275
+ }
276
+
277
+
278
+
279
+ }
280
+
281
+ ```
282
+
283
+
284
+
285
+ Circleも同様です。