前提・実現したいこと
配列同士比べて、1つでも重複している要素があれば、配列同士をまとめるという事をしたいです。
該当のソースコード
C#
1 2 3HashSet<int> A = new HashSet<int> { 1, 2, 6 }; 4HashSet<int> B = new HashSet<int> { 6, 8 }; 5HashSet<int> C = new HashSet<int> { 9, 5 }; 6HashSet<int> D = new HashSet<int> { 1, 3, 8 }; 7HashSet<int> E = new HashSet<int> { 7, 9 }; 8HashSet<int> F = new HashSet<int> { 4 }; 9 10/*欲しい結果 11[配列A[1,2,3,6,8],配列B[4],配列C[5,7,9]] 12のように、ダブりなく組み分けしたい。 13ちなみに配列の中の数字はは毎回ランダムに変わります。 14*/
試したこと
HashSetで重複しない配列を作れるというのはわかったのですが、
判定して結合していくループをどう作ったら良いのかが全くわかりません。
ご教授いただければ幸いです。
新たに試してみたソースコード
C#
1 2 //ランダムな数字を持ったハッシュセット 3 HashSet<int> A = new HashSet<int> { 1, 2, 6 }; 4 HashSet<int> B = new HashSet<int> { 6, 8 }; 5 HashSet<int> C = new HashSet<int> { 9, 5 }; 6 HashSet<int> D = new HashSet<int> { 1, 3, 8 }; 7 HashSet<int> E = new HashSet<int> { 7, 9 }; 8 HashSet<int> F = new HashSet<int> { 4 }; 9 10 //上記のハッシュセットをまとめたリスト 11 List<HashSet<int>> listA; 12 13 //最終でダブりのないハッシュセットをもつリスト 14 List<HashSet<int>> listB; 15 //補佐のリスト 16 List<HashSet<int>> listC; 17 //listBに追加するか否かのフラグ 18 private bool NA = false; 19 20 void Start () { 21 //初期化 22 listA = new List<HashSet<int>> { A, B, C, D, E, F }; 23 listB = new List<HashSet<int>> { }; 24 listC = new List<HashSet<int>> { }; 25 } 26 27 public void Union() 28 { 29 //listAの中身を総当たりして、要素が被ってたら一番最初のハッシュセットにまとめる 30 for (int i = 0; i < listA.Count; i++) 31 { 32 for (int j = 1; j < listA.Count; j++) 33 { 34 if (listA[i].Overlaps(listA[j])) 35 { 36 listA[i].UnionWith(listA[j]); 37 } 38 } 39 NA = true; 40 if(listC.Count!=0){ 41 foreach(var k in listC){ 42 //すでに要素が被ってるものがある場合はlistBに追加しない 43 if (listA[i].Overlaps(k)){ 44 NA = false; 45 } 46 } 47 } 48 if(NA==true){listB.Add(listA[i]);} 49 listC.Add(listA[i]); 50 } 51 52 print("最終チェック"+listB.Count); 53 foreach (var l in listB) 54 { 55 print(l + "の中の数字は"); 56 foreach (var m in l) 57 { 58 print(m); 59 } 60 } 61 } 62
HashSet.Contains() と HashSet.RemoveWhere() を使えば、出来そう。参考まで (時間が取れれば、確認してみたい)
ありがとうございます!
恥ずかしながら、プログラムがかなりの初心者で、HashSet.Contains() と HashSet.RemoveWhere() を使う方法が考えてみたもののわからずじまいでした。
overlapというのとUnionWithというのを使ってとりあえずやってみました。新たに試してみたソースコードというところに載せております。
とりあえずの結果が取れたっぽいのだけど、このソースだと例外でうまいこといかない場合があるのでは、、、と不安です。
間違っていたり、もう少し賢いやり方があればあればご指摘いただけると幸いです。。
欲しいものについて詳しい条件を伺いたいのですが、[1,3][3,5,][5,7]の3つは1つになってよいのでしょうか。つまり、1つめと3つめは互いに共通要素はないのですが、2つ目がいることによって連結される?それとも[1,3,5]と[3,5,7]の2つでしょうか?
はい、2つ目がいることによって連結される が正しいです!
SNSのつながりみたいな感じで、繋がってたらそのグラフを1グループにするイメージです。
[1,3][3,5,][5,7]の3つは1つにしたいです。 サンプルの例だと、Fだけ4は誰とも被ってないので1グループとなります。
回答4件
あなたの回答
tips
プレビュー