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

回答編集履歴

2

コードの見直し

2018/07/17 14:21

投稿

pepperleaf
pepperleaf

スコア6385

answer CHANGED
File without changes

1

コードの見直し

2018/07/17 14:21

投稿

pepperleaf
pepperleaf

スコア6385

answer CHANGED
@@ -1,3 +1,31 @@
1
+ 書換えてみました。
2
+ 他の方ほど、シンプルでありませんが、一応。
3
+
4
+ ```C#
5
+ List<HashSet<int>> hashList = new List<HashSet<int>>() {A, B, C, D, E, F }; // 全リスト
6
+ List<HashSet<int>> orgList = new List<HashSet<int>>();
7
+ bool exitFlag = false;
8
+ while (!exitFlag) { // 重複データがある間、ループする
9
+ orgList = hashList;
10
+ hashList = new List<HashSet<int>>();
11
+ exitFlag = true;
12
+ // orgList --> hashList へコピーしながら、検査
13
+ foreach (var item in orgList) {
14
+ bool found = false;
15
+ foreach (var newitem in hashList) {
16
+ if (item.Overlaps(newitem)) { // 重複データがあるか
17
+ newitem.UnionWith(item); // あれば、マージ
18
+ found = true;
19
+ break;
20
+ }
21
+ }
22
+ if (!found) hashList.Add(item); // 重複が見つからないので、追加
23
+ exitFlag &= !found; // 重複があったか?
24
+ }
25
+ }
26
+ ```
27
+
28
+ -------- 最初のコード ----------------------------
1
29
  以下のコードではどうでしょうか?
2
30
 
3
31
  ```C#
@@ -6,9 +34,10 @@
6
34
  HashSet<int> allSet = new HashSet<int>(); // 全てのデータを格納する
7
35
  foreach (var hash in hashList) {
8
36
  hash.ExceptWith(allSet); // 重複データを除く
9
- foreach (var item in hash) { // 確認済みデータに追加
37
+ ~~foreach (var item in hash) { // 確認済みデータに追加
10
38
  allSet.Add(item);
11
- }
39
+ }~~
40
+ allSet.UnionWith(hash); // これで良かった。
12
41
  }
13
42
 
14
43
  ```