📄 multisetasarray.cs
字号:
namespace Opus6
{
using System;
using System.Collections;
[Version("$Id: MultisetAsArray.cs,v 1.6 2001/10/28 19:50:09 brpreiss Exp $"), Copyright("Copyright (c) 2001 by Bruno R. Preiss, P.Eng.")]
public class MultisetAsArray : AbstractSet, Multiset, SearchableContainer, Container, IComparable, IEnumerable
{
public MultisetAsArray(int n) : base(n)
{
this.array = new int[base.universeSize];
for (int num1 = 0; num1 < base.universeSize; num1++)
{
this.array[num1] = 0;
}
}
public override void Accept(Visitor visitor)
{
for (int num1 = 0; num1 < base.universeSize; num1++)
{
for (int num2 = 0; num2 < this.array[num1]; num2++)
{
visitor.Visit(num1);
if (visitor.IsDone)
{
return;
}
}
}
}
public override int CompareTo(object arg)
{
throw new MethodNotImplementedException();
}
public virtual Multiset Difference(Multiset set)
{
MultisetAsArray array1 = (MultisetAsArray) set;
if (base.universeSize != array1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
MultisetAsArray array2 = new MultisetAsArray(base.universeSize);
for (int num1 = 0; num1 < base.universeSize; num1++)
{
if (array1.array[num1] <= this.array[num1])
{
array2.array[num1] = this.array[num1] - array1.array[num1];
}
}
return array2;
}
public virtual bool Equals(Multiset set)
{
MultisetAsArray array1 = (MultisetAsArray) set;
if (base.universeSize != array1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
for (int num1 = 0; num1 < base.universeSize; num1++)
{
if (this.array[num1] != array1.array[num1])
{
return false;
}
}
return true;
}
public override IEnumerator GetEnumerator()
{
return new Opus6.MultisetAsArray.Enumerator(this);
}
public override void Insert(int item)
{
int[] numArray1;
int num1;
(numArray1 = this.array)[num1 = item] = numArray1[num1] + 1;
}
public virtual Multiset Intersection(Multiset set)
{
MultisetAsArray array1 = (MultisetAsArray) set;
if (base.universeSize != array1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
MultisetAsArray array2 = new MultisetAsArray(base.universeSize);
for (int num1 = 0; num1 < base.universeSize; num1++)
{
array2.array[num1] = Math.Min(this.array[num1], array1.array[num1]);
}
return array2;
}
public override bool IsMember(int item)
{
return (this.array[item] > 0);
}
public virtual bool IsSubset(Multiset set)
{
MultisetAsArray array1 = (MultisetAsArray) set;
if (base.universeSize != array1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
for (int num1 = 0; num1 < base.universeSize; num1++)
{
if (this.array[num1] <= array1.array[num1])
{
return false;
}
}
return true;
}
public static void Main()
{
AbstractSet.TestMultiset(new MultisetAsArray(0x20), new MultisetAsArray(0x20), new MultisetAsArray(0x20));
}
public override void Purge()
{
for (int num1 = 0; num1 < base.universeSize; num1++)
{
this.array[num1] = 0;
}
}
public virtual Multiset Union(Multiset set)
{
MultisetAsArray array1 = (MultisetAsArray) set;
if (base.universeSize != array1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
MultisetAsArray array2 = new MultisetAsArray(base.universeSize);
for (int num1 = 0; num1 < base.universeSize; num1++)
{
array2.array[num1] = this.array[num1] + array1.array[num1];
}
return array2;
}
public override void Withdraw(int item)
{
if (this.array[item] > 0)
{
int[] numArray1;
int num1;
(numArray1 = this.array)[num1 = item] = numArray1[num1] - 1;
}
}
public override int Count
{
get
{
int num1 = 0;
for (int num2 = 0; num2 < base.universeSize; num2++)
{
num1 += this.array[num2];
}
return num1;
}
}
protected int[] array;
private class Enumerator : IEnumerator
{
internal Enumerator(MultisetAsArray multiset)
{
this.item = -1;
this.multiset = multiset;
}
public bool MoveNext()
{
this.count++;
if ((this.item < 0) || ((this.item >= 0) && (this.count == this.multiset.array[this.item])))
{
this.count = 0;
this.item++;
while (this.item < this.multiset.UniverseSize)
{
if (this.multiset.array[this.item] > 0)
{
break;
}
this.item++;
}
if (this.item == this.multiset.UniverseSize)
{
this.item = -1;
}
}
return (this.item >= 0);
}
public void Reset()
{
this.item = -1;
}
public object Current
{
get
{
if (this.item < 0)
{
return new InvalidOperationException();
}
return this.item;
}
}
private int count;
private int item;
private MultisetAsArray multiset;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -