前言:

最近在使用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. new Intent(String action,Uri uri)构造器说明

    这是myDiary这个工程下MainActivity中的protected void onListItemClick(ListView l, View v, int position, long id ...

  2. GDG shanghai programming one hour by JavaScript

    刚在昨天参加了一场JS入门编程的活动,目的就是提升对JS的兴趣. 因为是针对零基础开发者的,一上来就是“Hello World!”了 当然,想用JS输出"Hello World!" ...

  3. (Problem 2)Even Fibonacci numbers

    Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting w ...

  4. linux下I2C驱动

    2C协议规定了主机和从机的概念,在驱动中采用的多是适配器(主机)和设备(从机).首先,i2c规定  Bus    -> Algorithm  算法               Adapter   ...

  5. oschina应用工具

    应用工具 22思维导图软件 9博客客户端 15加密/解密/破解 120浏览器 78邮件工具 327文档/文本编辑 31杀毒软件 177终端/远程登录 195IM/聊天/语音工具 74下载工具 64文件 ...

  6. xp每天定时关机命令

    at 00:00 /every:M,T,W,Th,F,S,Su shutdown -s -t 120 能够把00:00改成你想要每天定时关机的时间,120是指关机倒计时的秒数,也能够更改 M,T,W, ...

  7. Shell之sed命令

    sed用于一次性处理所有的编辑任务,尤为高效,为用户节省了大量的时间,sed适用于以下三种场合: 1.编辑相对交互文本编辑器而言太大的文件: 2.编辑命令太复杂,在交互式文本编辑器中难以输入的情况: ...

  8. mysql如何开启远程连接

    链接地址:http://jingyan.baidu.com/article/046a7b3ed85f3ef9c27fa9dc.html 大家在公司工作中,经常会遇到mysql数据库存储于某个人的电脑上 ...

  9. QVector 和vector的比较(QVector默认使用隐式共享,而且有更多的函数提供)

    QVector和vector的比较: Qvector默认使用隐式共享,可以用setSharable改变其隐式共享.使用non-const操作和函数将引起深拷贝.at()比operator[](),快, ...

  10. 创建成功的Python项目

    创建成功的Python项目 前端开发工具技巧介绍—Sublime篇 SEO在网页制作中的应用 观察者模式 使用D3制作图表 英文原文:Create successful Python projects ...