using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _05_MyHashSet
{
class CustomHashSet<T>
{
private CustomHashTable<T, bool> set;
private int count;
public CustomHashSet()
{
this.count = 0;
this.set = new CustomHashTable<T, bool>();
}
public CustomHashTable<T, bool> Set
{
get { return this.set; }
}
public int Count
{
get { return this.count; }
}
public void Add(T element)
{
this.set.Add(element, true);
this.count++;
}
public void Remove(T element)
{
this.set.Remove(element);
this.count--;
}
public T Find(T element)
{
bool result = this.set.Find(element);
if (result)
{
return element;
}
else
{
throw new KeyNotFoundException(string.Format("There is NO element with value = {0}", element));
}
}
public void Clear()
{
this.set = new CustomHashTable<T, bool>();
this.count = 0;
}
public void Union(CustomHashSet<T> otherSet)
{
foreach (KeyValuePair<T,bool> element in otherSet.Set)
{
this.set[element.Key] = true;
}
this.count = this.set.Count;
}
public void Intersect(CustomHashSet<T> otherSet)
{
List<T> toRemove = new List<T>(Math.Min(this.Count, otherSet.Count));
foreach (KeyValuePair<T,bool> element in this.set)
{
if (!otherSet.Set.Contains(element.Key))
{
toRemove.Add(element.Key);
}
}
foreach (T element in toRemove)
{
this.Remove(element);
}
this.count = this.set.Count;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0OwoKbmFtZXNwYWNlIF8wNV9NeUhhc2hTZXQKewogICAgY2xhc3MgQ3VzdG9tSGFzaFNldDxUPgogICAgewogICAgICAgIHByaXZhdGUgQ3VzdG9tSGFzaFRhYmxlPFQsIGJvb2w+IHNldDsKICAgICAgICBwcml2YXRlIGludCBjb3VudDsKCiAgICAgICAgcHVibGljIEN1c3RvbUhhc2hTZXQoKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuc2V0ID0gbmV3IEN1c3RvbUhhc2hUYWJsZTxULCBib29sPigpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIEN1c3RvbUhhc2hUYWJsZTxULCBib29sPiBTZXQKICAgICAgICB7CiAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzLnNldDsgfQogICAgICAgIH0KICAgICAgICBwdWJsaWMgaW50IENvdW50CiAgICAgICAgewogICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpcy5jb3VudDsgfQogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgQWRkKFQgZWxlbWVudCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuc2V0LkFkZChlbGVtZW50LCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5jb3VudCsrOwogICAgICAgIH0KICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoVCBlbGVtZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5zZXQuUmVtb3ZlKGVsZW1lbnQpOwogICAgICAgICAgICB0aGlzLmNvdW50LS07CiAgICAgICAgfQogICAgICAgIHB1YmxpYyBUIEZpbmQoVCBlbGVtZW50KQogICAgICAgIHsKICAgICAgICAgICAgYm9vbCByZXN1bHQgPSB0aGlzLnNldC5GaW5kKGVsZW1lbnQpOwogICAgICAgICAgICBpZiAocmVzdWx0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBLZXlOb3RGb3VuZEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJUaGVyZSBpcyBOTyBlbGVtZW50IHdpdGggdmFsdWUgPSB7MH0iLCBlbGVtZW50KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5zZXQgPSBuZXcgQ3VzdG9tSGFzaFRhYmxlPFQsIGJvb2w+KCk7CiAgICAgICAgICAgIHRoaXMuY291bnQgPSAwOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgVW5pb24oQ3VzdG9tSGFzaFNldDxUPiBvdGhlclNldCkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxULGJvb2w+IGVsZW1lbnQgaW4gb3RoZXJTZXQuU2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFtlbGVtZW50LktleV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuY291bnQgPSB0aGlzLnNldC5Db3VudDsKICAgICAgICB9CiAgICAgICAgcHVibGljIHZvaWQgSW50ZXJzZWN0KEN1c3RvbUhhc2hTZXQ8VD4gb3RoZXJTZXQpCiAgICAgICAgewogICAgICAgICAgICBMaXN0PFQ+IHRvUmVtb3ZlID0gbmV3IExpc3Q8VD4oTWF0aC5NaW4odGhpcy5Db3VudCwgb3RoZXJTZXQuQ291bnQpKTsKICAgICAgICAgICAgZm9yZWFjaCAoS2V5VmFsdWVQYWlyPFQsYm9vbD4gZWxlbWVudCBpbiB0aGlzLnNldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFvdGhlclNldC5TZXQuQ29udGFpbnMoZWxlbWVudC5LZXkpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvUmVtb3ZlLkFkZChlbGVtZW50LktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoVCBlbGVtZW50IGluIHRvUmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLlJlbW92ZShlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNvdW50ID0gdGhpcy5zZXQuQ291bnQ7CiAgICAgICAgfQogICAgfQp9Cg==