前言:

最近在使用Hashtable的时候发现一个问题:就是当你对Hashtable进行遍历的时候整个输出结果是毫无顺序的,

上网查了一下说是Hashtable有自己内部的排序机制,如果要自定义排序的话就要写算法,反正是很麻烦,而我现在

需要实现的仅仅是输入顺序和输入顺序对应即可,没必要这么麻烦的去写算法。

这里我们就需要使用到ArrayList,大家都知道ArrayList默认是不排序的(添加的顺序就是输出的顺序)。让它

和hashtable结合不就实现这种功能的吗?这样继承了Hashtable具有Hashtable的丰富功能,又满足ArrayList不排序

的功能。上网查了一些资料,顺便也介绍一些其他的排序方法,大家一起学习。

没有排序之前:

using System.Collections;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Hashtable map = new Hashtable();
map.Add("TableName", "T_English_Close");
map.Add("QuestionID", "10");
map.Add("Scope", "课内");
map.Add("BookName", "第一册");
map.Add("Chapter", "第一章");
map.Add("QuestionType", "完型填空");
map.Add("Degree", "2");
map.Add("Fraction", "10");
foreach (string str in map.Keys)
{
Console.WriteLine(str + " : " +map[str]);
}
Console.Read();
}
}
}

输出结果:


一:输入什么顺序,输出就是什么顺序。

首先我们需要声明一个类来继承Hashtable,并重新它的一些方法,使ArrayList与Hashtable结合在一起:

public class AltHashTable : Hashtable
{
private ArrayList list = new ArrayList();
public override void Add(object key, object value)
{
base.Add(key, value);
list.Add(key);
}
public override void Clear()
{
base.Clear();
list.Clear();
}
public override void Remove(object key)
{
base.Remove(key);
list.Remove(key);
}
public override ICollection Keys
{
get
{
return list;
}
}
}

然后我们重新测试一下:

using System.Collections;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{ AltHashTable map= newAltHashTable(); map.Add("TableName", "T_English_Close");
map.Add("QuestionID", "10");
map.Add("Scope", "课内");
map.Add("BookName", "第一册");
map.Add("Chapter", "第一章");
map.Add("QuestionType", "完型填空");
map.Add("Degree", "2");
map.Add("Fraction", "10");
foreach (string str in map.Keys)
{
Console.WriteLine(str + " : " +map[str]);
}
Console.Read();
}
}
}

输出结果正是我们想要的:

二:下面我们在分别介绍一下按Key值和Value值排序的方法。

首先要知道如何将Hashtable转换为ArrayList:

ArrayList list = new ArrayList(ht.Values);
ArrayList list=  new ArrayList(ht.Keys);

按Key值排序:

using System.Collections;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Hashtable map = new Hashtable ();
map.Add("TableName", "T_English_Close");
map.Add("QuestionID", "10");
map.Add("Scope", "课内");
map.Add("BookName", "第一册");
map.Add("Chapter", "第一章");
map.Add("QuestionType", "完型填空");
map.Add("Degree", "2");
map.Add("Fraction", "10");
ArrayList list = new ArrayList(map.Keys);
list.Sort();
foreach (string str in list)
{
Console.WriteLine(str + ":" + map[str]);
}
Console.Read();
}
}
}

输出结果:

按Value值排序跟按Key值排序一样,在这里就不在写代码了。大家可以自己动手实践一下!

原理:

实际上是按照每一个字符的ASCII的值就行排序的。从左到右比较每个字符的Ascii的值,直到满足两个字符的ASCII

的值不同即停止比较 。

总结:

针对Hashtable排序的特殊要求,可以先把它的键或值转化成ArrayList,针对ArrayList进行排序,进而也就实现了

Hashtable的排序.毕竟ArrayList已经支持一些排序。而且ArrayList的排序种类非常多,我们在下面文章中在重点说一

下ArrayList的使用。

利用ArrayList对Hashtable其进行排序的更多相关文章

  1. 类 Array Arraylist List Hashtable Dictionary

    总结C# 集合类 Array Arraylist List Hashtable Dictionary Stack Queue  我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashT ...

  2. C#中集合ArrayList与Hashtable的使用

    C#中集合ArrayList与Hashtable的使用 http://blog.csdn.net/linukey/article/details/42506819 ArrayList: 一. 注意事项 ...

  3. JQuery利用sort对DOM元素进行排序

    前言 排序对于我们是再熟悉不过了,在绝大数应用程序中都会有这样一个场景:当我们从服务器端获取一个列表时,在界面上进行渲染,我们可以会依赖于某一个规则来进行排序,当然此时绝大多数会再次与服务器进行交互来 ...

  4. ArrayList、HashTable、List、Dictionary的演化及如何选择使用

    在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求. 由于这种限制不方便,所以出现了ArrayList. ArrayList.List<T> ArrayList是可变长数组,你 ...

  5. 利用skipList(跳表)来实现排序(待补充)

    用于排名的数据结构 一般排序为利用堆排序(二叉树)和利用skipList(跳表)的方式 redis中SortedSet利用skipList(跳表)来实现排序,复杂度为O(logn),利用空间换时间,类 ...

  6. 【LeetCode】two num 利用comparable接口 对对象进行排序

    题目two num 题意:给定一个整数数组和一个目标值.要求在数组中找到两个数.使得它们的和相加等于目标值.而且返回两个数的下标 思路:1.假设使用暴力,时间复杂度为O(n^2) 2.能够先将全部数进 ...

  7. 《挑战30天C++入门极限》在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。

        在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子. 以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址. #include <std ...

  8. java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)

    package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...

  9. [转载]C# HashTable 遍历与排序

    private void Form1_Load(object sender, EventArgs e) { Hashtable ht = new Hashtable(); ht.Add("j ...

随机推荐

  1. BZOJ 2157: 旅游( 树链剖分 )

    树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...

  2. 错误处理try catch

    <?phpfunction inverse($x) { if (!$x) { throw new Exception('被除数不能为0'); } if ($x>31) { throw ne ...

  3. 我的Python成长之路---第四天---Python基础(16)---2016年1月23日(寒风刺骨)

    四.正则表达式     字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和 ...

  4. iOS5.1下emoji表情显示方框的解决办法

    在iOS5.1的部分设备上,emoji表情无法正常显示.我测试了一下,iOS5.1(9B176 for iPhone 4)无法正常显示emoji,全部是方框iOS5.1(9B179 for iPhon ...

  5. Mysql 启动失败 报错 1067

    Mysql装好后,重启电脑第二次发现服务无法启动.提示如下: ------------------------ MySQL 服务无法启动. 系统出错. 发生系统错误 1067. 进程意外终止. --- ...

  6. Unity3d 网络编程(二)(Unity3d内建网络各项參数介绍)

    这里是全部Unity3d在网络中能用到相关的类及方法.纵观參数功能, Unity3d来写一个手游是不二的选择: RPC 能够传递的參数 int float string NetworkPlayer N ...

  7. R语言RJava安装步骤

     1.安装JDK 2.在R下运行install.packages("rJava") 2.环境变量设置 CLASSPATH=xxx\R-xxx\library\rJava\jri ...

  8. 09-IOSCore - 应用互动、UIImagePickerController

    一.调用系统程序/服务 1. 应用互动数据权限 1) 跟自己本地数据交互 2) 跟网络服务器/云数据交互 3) 跟系统数据服务交互 4) 跟其它应用程序交互 2. 基础 URL 统一资源定位 一个特殊 ...

  9. Oracle多实例的配置方法

    SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME /dbhome_2) (PROGRAM ...

  10. MONGODB的内部构造 FROM 《MONGODB THE DEFINITIVE GUIDE》

    今天下载了<MongoDB The Definitive Guide>电子版,浏览了里面的内容,还是挺丰富的.是官网文档实际应用方面的一个补充.和官方文档类似,介绍MongoDB的内部原理 ...