利用ArrayList對Hashtable其進行排序

前言:

最近在使用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:

vcD4KPHByZSBjbGFzcz0=”brush:java;”>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的使用。

You May Also Like