sortedlistasarray.cs

来自「Data Structures and Algorithms with Obj」· CS 代码 · 共 134 行

CS
134
字号
namespace Opus6
{
    using System;
    using System.Collections;

    [Copyright("Copyright (c) 2001 by Bruno R. Preiss, P.Eng."), Version("$Id: SortedListAsArray.cs,v 1.5 2001/10/28 19:50:09 brpreiss Exp $")]
    public class SortedListAsArray : OrderedListAsArray, Opus6.SortedList, SearchableContainer, Container, IComparable, IEnumerable
    {
        public SortedListAsArray(int size) : base(size)
        {
        }

        public override ComparableObject Find(ComparableObject obj)
        {
            int num1 = this.FindOffset(obj);
            if (num1 >= 0)
            {
                return base.array[num1];
            }
            return null;
        }

        protected int FindOffset(ComparableObject obj)
        {
            int num1 = 0;
            int num2 = base.count - 1;
            while (num1 <= num2)
            {
                int num3 = (num1 + num2) / 2;
                if (obj > base.array[num3])
                {
                    num1 = num3 + 1;
                }
                else
                {
                    if (obj < base.array[num3])
                    {
                        num2 = num3 - 1;
                        continue;
                    }
                    return num3;
                }
            }
            return -1;
        }

        public override Cursor FindPosition(ComparableObject obj)
        {
            return new Opus6.SortedListAsArray.MyCursor(this, this.FindOffset(obj));
        }

        public override void Insert(ComparableObject obj)
        {
            if (base.count == base.array.Length)
            {
                throw new ContainerFullException();
            }
            int num1 = base.count;
            while ((num1 > 0) && (base.array[num1 - 1] > obj))
            {
                base.array[num1] = base.array[num1 - 1];
                num1--;
            }
            base.array[num1] = obj;
            base.count++;
        }

        public static void Main()
        {
            Opus6.Console.WriteLine("SortedListAsArray Test");
            Opus6.SortedList list1 = new SortedListAsArray(10);
            SortedListAsArray.TestSortedList(list1);
        }

        internal static void TestSortedList(Opus6.SortedList list)
        {
            list.Insert((ComparableObject) 4);
            list.Insert((ComparableObject) 3);
            list.Insert((ComparableObject) 2);
            list.Insert((ComparableObject) 1);
            Opus6.Console.WriteLine(list);
            ComparableObject obj1 = list.Find((ComparableObject) 2);
            list.Withdraw(obj1);
            Opus6.Console.WriteLine(list);
            foreach (ComparableObject obj2 in list)
            {
                Opus6.Console.WriteLine(obj2);
            }
        }

        public override void Withdraw(ComparableObject obj)
        {
            if (base.count == 0)
            {
                throw new ContainerEmptyException();
            }
            int num1 = this.FindOffset(obj);
            if (num1 < 0)
            {
                throw new ArgumentException("object not found");
            }
            int num2 = num1;
            while (num2 < (base.count - 1))
            {
                base.array[num2] = base.array[num2 + 1];
                num2++;
            }
            base.array[num2] = null;
            base.count--;
        }



        private class MyCursor : OrderedListAsArray.MyCursor
        {
            internal MyCursor(SortedListAsArray list, int index) : base(list, index)
            {
            }

            public override void InsertAfter(ComparableObject obj)
            {
                throw new InvalidOperationException();
            }

            public override void InsertBefore(ComparableObject obj)
            {
                throw new InvalidOperationException();
            }

        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?