zoukankan      html  css  js  c++  java
  • 构建可反转排序的泛型字典类(1)雏形

     

    构建可反转排序的泛型字典类

    前言

    前段时间为了查找泛型资料,我翻译了O'Reilly 出版的《C# Cookbook》这本书的几个关于泛型的章节。其中“4.8 反转Sorted List里的内容”(见

    http://cgbluesky.blog.163.com/blog/static/2412355820081211016581/ )这一节中有一个接近1300行代码的例子。当时看到这个例子吓了一跳,这是一个足以让人头晕眼花的数字。粗略看了一下,感觉代码质量非常高,非常值得我们去学习。于是决定写一系列文章分析它,象搭积木一样逐步把这个ReversibleSortedList构建完成。

        在读这一篇文章之前,您需要明白一件事:如果只在一个项目里用到这个类,有必要花费1300行代码去构建它吗?我个人的观点是没有必要。FCLFramework Class Library)中有很多现成的东西,拿过来用就行了。那还有什么理由去研究它呢?我提供以下几点做为参考:

    l         想通过阅读高质量的代码来提高自己。

    l         FCL如此着迷,想通过它迈出第一步。

    l         您希望自己的代码有机会给其他程序员使用,换句话说,您面向的是程序员,您是一个组件编写者。从某一方面说,您越麻烦,就意味着您的用户越方便。

    呵呵,不那么多疲话了,开始工作。

    雏形

    你想构建一个集合类用于存储数据,它里面的值是成对出现的,每一对值都包含“键”和“值”两个部分。键和值里存放的数据类型是不确定的,最好什么类型放到里面都适用。想起了什么?就是它!泛型!真是太伟大了!

    接下来要考虑的问题是采用什么样的方式来存储这些值,你觉得自己的数据结构学得还比较好,决定要控制一切。在所有集合类型中,数组的速度是最快的,而且它使用方便并且是类型安全的,唯一的缺点就是容量固定。好!不管那么多了,用的就是它。先把代码写出来再说。

    public class ReversibleSortedList<TKey, TValue>

    {

        private TKey[] keys; //键数组

        private TValue[] values; //值数组

    }

    总算迈出了第一步,确定了大的方向。但是数组是容量固定的,如何能让它的容量可以随着元素的增长而自动增长呢?即然要控制容量,那就要有一个容量属性,用于读取和设置容量。先从读取开始,容量值就是数组keysvalues的长度。好,继续添加代码:

    public class ReversibleSortedList<TKey, TValue>

    {

        private TKey[] keys; //键数组

        private TValue[] values; //值数组

    public int Capacity //容量属性

        {

            get

            {

                return this.keys.Length;

            }

        }

    }

    现在问题来了,当ReversibleSortedList被实例化后直接读取Capacity属性,将会调用keys.Length属性来返回。但此时keys并没有被初始化,肯定不能访问其Length属性。可不可以在声明的同时把它初始化为元素个数为0的数组呢?

    private TKey[] keys = new TKey[0]; //键数组

    这样做是没有什么问题,但它刚声明就成为了垃圾,什么都放不了,总让人感觉不舒服。那可不可以让数组初始化为一个固定容量呢?

    private TKey[] keys = new TKey[4]; //键数组

    但你是一个完美主义者,不希望这样就使用了4个位置的空间,你更希望在添加元素时才会有空间的拓展。可不可以声明两个静态的,初始长度为0的数组做为其初始状态呢?这样不管类有多少个实例,进行初始化时使用的都是它们。这样即避免了空间的浪费,也不再需要多次初始化0长度数组。

        private static TKey[] emptyKeys; //用于键数组的初始化

        private static TValue[] emptyValues; //用于值数组的初始化

    可以在静态构造器(又称类型构造器)里把它们初始化为长度为0的数组,并在无参实例构造器中把这两个初始值赋给keysvalues数组。

    为了测试自己的想法,需要添加Main()方法进行测试,下列代码可以直接拷贝并运行,如果不知道如何运行,请参考:

    http://www.enet.com.cn/eschool/video/c/1.shtml

    ReversibleSortedList 0.1版本:对ReversibleSortedList类的容量进行初始化

    using System;
    using System.Collections;
    using System.Collections.Generic;

    public class ReversibleSortedList<TKey, TValue>
    {
        
    #region 成员变量
        
    private TKey[] keys; //键数组
        private TValue[] values; //值数组
        private static TKey[] emptyKeys; //用于键数组的初始化
        private static TValue[] emptyValues; //用于值数组的初始化
        #endregion
        
    #region 构造方法
        
    //类型构造器
        static ReversibleSortedList()
        {
            ReversibleSortedList
    <TKey, TValue>.emptyKeys = new TKey[0];
            ReversibleSortedList
    <TKey, TValue>.emptyValues = new TValue[0];
        }
        
    public ReversibleSortedList()
        {
            
    this.keys = ReversibleSortedList<TKey, TValue>.emptyKeys;
            
    this.values = ReversibleSortedList<TKey, TValue>.emptyValues;
        }
        
    #endregion
        
    #region 公有属性
        
    public int Capacity //容量属性
        {
            
    get
            {
                
    return this.keys.Length;
            }
        }
        
    #endregion
    }
    public class Test
    {
        
    static void Main()
        {
            ReversibleSortedList
    <intstring> rs=new ReversibleSortedList<intstring>();
            Console.WriteLine(rs.Capacity);
        }
    }

     

    运行结果:

    0

  • 相关阅读:
    51nod1381 硬币游戏
    51nod1381 硬币游戏
    51nod1384 全排列
    LOJ P10130 点的距离 题解
    POJ P1985 Cow Marathon 题解
    求树的直径(两种方法)
    洛谷 P3518 [POI2011] SEJ-Strongbox 题解
    洛谷 UVA12101 Prime Path 题解
    POJ P2251 Dungeon Master 题解
    POJ P3009 Curling 2.0 题解
  • 原文地址:https://www.cnblogs.com/abatei/p/1067166.html
Copyright © 2011-2022 走看看