集合和泛型6-----集合4 类SortedList、 BitArray

 

l         SortedList所能完成的功能就相当于ArrayListHashtable的组合,SortedList元素可通过其键来访问,也可以通过其索引(索引从零开始)来访问,而且SortedLis里面的元素是经过排序存放的。SortedList对象的元素将由键按照特定的比较方法实现,或按照键本身提供的比较方法实现进行排序。不论在哪种情况下,SortedList 都不允许重复键。

SortedList 对象在内部维护两个数组以存储列表的元素;即,一个数组用于键,另一个数组用于相关联的值。每个元素都是一个可作为DictionaryEntry对象进行访问的键/值对。键不能为 null,但值可以。

由于类SortedList的功能相当于ArrayListHashtable的组合,所以属性与方法也大多是这二者的组合。SortedList对象的容量是SortedList可以保存的元素数。随着向SortedList中添加元素,容量通过重新分配按需自动增加。可通过调用TrimToSize或通过显式设置Capacity属性减少容量。索引顺序基于排序顺序。当添加元素时,元素将按正确的排序顺序插入 SortedList,同时索引会相应地进行调整。当移除元素时,索引也会相应地进行调整。

SortedList的排序的方法可以在构造函数中直接指定。例子SortedListSample演示了一个按照降序排列的区号与城市的有序列表。

首先提供比较方法的类MyCompare

namespace SortedListSample

{

    public class MyCompare : IComparer

    {

        public int Compare(Object obj1,Object obj2)

        {

            return (Int32)obj2 -(Int32)obj1;

        }

    }

}

测试代码为:

namespace SortedListSample

{

    class Program

    {

        static void Main(string[] args)

        {

            //生成一个SortedList对象,并传递实现了IComparer接口的类

            SortedList sortedlist = new SortedList(new MyCompare());

            sortedlist.Add(010, "北京");

            sortedlist.Add(022, "天津");

            sortedlist.Add(0451, "哈尔滨");

            sortedlist.Add(0511, "镇江");

            sortedlist.Add(0371, "郑州");

            sortedlist.Add(0798, "景德镇");

            //通过索引来遍历SortedList对象

            for (int i = 0; i < sortedlist.Count; i++)

            {

                Console.WriteLine("区号0{0}-------城市名:{1}", sortedlist.GetKey(i), sortedlist.GetByIndex(i));

            }

            //由值得到索引

            Console.WriteLine("{0}在列表中的索引是{1}", "哈尔滨", sortedlist.IndexOfValue("哈尔滨"));

            //由键得到索引

            Console.WriteLine("0{0}在列表中的索引是{1}", 0371, sortedlist.IndexOfKey(0371));

            Console.WriteLine("表中{0}键是010的项。", sortedlist.ContainsKey(010) ? "" : "没有");

            Console.WriteLine("表中{0}键是0374的项。", sortedlist.ContainsKey(0374) ? "" : "没有");

            Console.WriteLine("表中{0}值是景德镇的项。", sortedlist.ContainsValue("景德镇") ? "" : "没有");

            Console.WriteLine("表中{0}值是襄樊的项。", sortedlist.ContainsValue("襄樊") ? "" : "没有");

            Console.ReadKey();

        }

    }

}

程序运行的结果是:

区号0798-------城市名:景德镇

区号0511-------城市名:镇江

区号0451-------城市名:哈尔滨

区号0371-------城市名:郑州

区号022-------城市名:天津

区号010-------城市名:北京

哈尔滨在列表中的索引是2

0371在列表中的索引是3

表中有键是010的项。

表中没有键是0374的项。

表中有值是景德镇的项。

表中没有值是襄樊的项。

l         BitArray类是一个比特数组,数组的大小在生成对象的时候已经确定,每个数据元素只能表示一个比特,元素的值只能是10,其中用true表示1,用false表示0。当用其他数据类型的元素初始化该对象时,那么每个元素将占用该类型在内存中存储长度的数组空间。比如,int在内存中占用32位,那么一个整型数据就会占用BitArray类对象的32个空间。

BitArray类的对象中用属性Count表示该对象的空间的大小,用Length来表示该对象包含的元素的个数。

10-8列出了类BitArray中一些特有的方法

10-8

名称

功能说明

And

对当前BitArray中的元素和指定的BitArray中的相应元素执行按位“与”运算

Or

对当前BitArray中的元素和指定的BitArray中的相应元素执行按位“或”运算

Not

反转当前BitArray中的所有位值

Xor

对当前BitArray中的元素和指定的BitArray中的相应元素执行按位“异或”运算

Get

获取BitArray中特定位置处的位的值

Set

BitArray中特定位置处的位设置为指定值

SetAll

BitArray中的所有位设置为指定值

例子BitArraySamples演示了类BitArray的一些使用方法。

using System;

using System.Collections; //注意命名空间

using System.Linq;

using System.Text;

 

namespace BitArraySamples

{

    class Program

    {

        public static void Main()

        {

            // 建立和初始化若干个数组.

            BitArray myBA1 = new BitArray(5);

            BitArray myBA2 = new BitArray(5, false);

            byte[] myBytes = new byte[2] { 2,  4};

            BitArray myBA3 = new BitArray(myBytes);

            bool[] myBools = new bool[5] { true, false, true, true, false };

            BitArray myBA4 = new BitArray(myBools);

            int[] myInts = new int[1] { 8 };

            BitArray myBA5 = new BitArray(myInts);

            // 显示数组的属性与数组中的内容.

            Console.WriteLine("myBA1");

            Console.WriteLine("   数组大小:    {0}", myBA1.Count);

            Console.WriteLine("   数组中元素的个数:   {0}", myBA1.Length);

            Console.WriteLine("   数组中元素:");

 

            PrintValues(myBA1, 8);

            Console.WriteLine("myBA2");

            Console.WriteLine("   数组大小:    {0}", myBA2.Count);

            Console.WriteLine("   数组中元素的个数:   {0}", myBA2.Length);

            Console.WriteLine("   数组中元素:");

            PrintValues(myBA2, 8);

 

            Console.WriteLine("myBA3");

            Console.WriteLine("   数组大小:    {0}", myBA3.Count);

            Console.WriteLine("   数组中元素的个数:   {0}", myBA3.Length);

            Console.WriteLine("   数组中元素:");

            PrintValues(myBA3, 8);

 

            Console.WriteLine("myBA4");

            Console.WriteLine("   数组大小:    {0}", myBA4.Count);

            Console.WriteLine("   数组中元素的个数:   {0}", myBA4.Length);

            Console.WriteLine("   数组中元素:");

            PrintValues(myBA4, 8);

 

            Console.WriteLine("myBA5");

            Console.WriteLine("   数组大小:    {0}", myBA5.Count);

            Console.WriteLine("   数组中元素的个数:   {0}", myBA5.Length);

            Console.WriteLine("   数组中元素:");

            PrintValues(myBA5, 8);

            Console.ReadKey();

        }

 

        public static void PrintValues(IEnumerable myList, int myWidth)

        {

            int i = myWidth;

            foreach (Object obj in myList)

            {

                if (i <= 0)

                {

                    i = myWidth;

                    Console.WriteLine();

                }

                i--;

                Console.Write("{0,8}", obj);

            }

            Console.WriteLine();

        }

    }

}

 

程序的运行结果是

myBA1

   数组大小:    5

   数组中元素的个数:   5

   数组中元素:

   False   False   False   False   False

myBA2

   数组大小:    5

   数组中元素的个数:   5

   数组中元素:

   False   False   False   False   False

myBA3

   数组大小:    16

   数组中元素的个数:   16

   数组中元素:

   False    True   False   False   False   False   False   False

   False   False    True   False   False   False   False   False

myBA4

   数组大小:    5

   数组中元素的个数:   5

   数组中元素:

    True   False    True    True   False

myBA5

   数组大小:    32

   数组中元素的个数:   32

   数组中元素:

   False   False   False    True   False   False   False   False

   False   False   False   False   False   False   False   False

   False   False   False   False   False   False   False   False

   False   False   False   False   False   False   False   False

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值