亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Excelize函數庫Excel多關鍵字排序算法的設計與實現

        2021-09-26 02:59:43李琨賈立偉石曉明
        無線互聯科技 2021年15期

        李琨 賈立偉 石曉明

        摘 要:文章基于Excelize第三方函數庫,針對目前Excelize函數庫沒有實現排序函數的問題,以最低位優(yōu)先算法思想為基礎,設計并實現了Excel數據的多關鍵字排序算法。根據對實際案例進行排序測試所得的結果可知,該算法能夠滿足Excel工作表數據的單關鍵字、多關鍵字和自定義序列的排序操作。該排序算法的實現為今后設計并實現“計算機應用基礎”課程自動判卷系統(tǒng)進一步奠定了技術基礎。

        關鍵詞:Excelize函數庫;Go語言;LSD算法;Excel工作簿;多關鍵字排序

        0? ? 引言

        為實現河南醫(yī)學高等專科學?!坝嬎銠C應用”課程在線考試系統(tǒng)的自動判卷操作以減輕教師的改卷壓力,筆者選擇以Go語言作為自動判卷系統(tǒng)的開發(fā)語言。Excelize是以Go語言開發(fā)的一套讀寫Excel工作簿的函數庫[1],且Excelize函數庫在運行時長和占用內存方面的表現都具有絕對優(yōu)勢[2],故筆者選擇Excelize函數庫作為該自動判分系統(tǒng)的第三方開發(fā)庫。

        本文在前期基于Excelize函數庫對復雜Excel工作簿的讀寫操作測試的基礎上,針對Excelize函數庫目前沒有實現排序函數的這個問題,以最低位優(yōu)先算法(LSD算法)[3]思想為基礎,基于Excelize函數庫設計并實現了Excel數據的多關鍵字排序算法。該排序算法的實現為今后設計并實現“計算機應用基礎”課程自動判卷系統(tǒng)進一步奠定了技術基礎。

        1? ? 基于Excelize函數庫實現Excel數據多關鍵字排序面臨的問題

        Excelize函數庫提供了大量操作Excel工作簿讀寫的函數和方法。因為Excel工作表是按行數據進行排序的,所以需要通過Excelize函數庫提供的GetRows()方法從Excel工作簿中讀取所有數據。但是,GetRows()方法返回的數據結果為二維字符串切片,使得無論工作表中的數據為何種類型,得到的結果均為字符串類型。這樣就使得對數據的操作存在以下3個方面的難題:(1)讀取的數據均存儲為字符串類型,無法利用程序自動判斷原數據的數據類型,降低了軟件的自動化程度。(2)假設排序關鍵字所在列為數值型數據,而讀取后的結果卻為字符串類型,需進行類型轉換操作,否則排序結果不正確。(3)當排序結束后,需要將排序結果寫回到Excel工作表中,此時需要將每一列數據由字符串類型轉換為原類型的數據,否則將改變原始數據的數據類型。

        2? ? 基于Excelize函數庫Excel多關鍵字排序算法的設計與實現

        2.1? 基于Excelize函數庫設計Excel多關鍵字排序算法

        本文通過對上述問題的分析和總結,以LSD算法為基礎,基于Excelize函數庫對Excel工作表數據設計并實現了多關鍵字排序算法。圖1中所示左側所示的是一個n行m列數據序列R={R1,R2,…,Ri,…,Rn}(1≤i≤n),其中Ri={Ri1,Ri2,…,Rij,…Rim}(1≤j≤m)為序列R的第i行數據,而Rij∈Dj為第i行第j列的數據值,且Dj={D1,D2,…,Dn}(1≤j≤m)為第j列所有數據的取值范圍。該圖是按第j列數據進行“分配”和“收集”過程的示例圖。切片Bucket(順序結構)為“排序桶”,桶中存放的是已經排列過順序(升序、降序或自定義序列)的第j列數據值的集合,其排列順序從下標0開始;Map類型變量CntBkt(隨機存儲結構)為“計數桶”,其key值記錄的是第j列的所有數據值的集合,而value值記錄的是在“收集”數據階段,第j列取值為Dij所對應的記錄在新生成的數據序列R中所對應的行號。切片Bucket和Map類型變量CntBkt生成的過程被稱為LSD算法的“分配”階段,而按照CntBkt中value值,重新生成新的數據序列R的過程被稱為LSD算法的“收集”階段。若需對數據序列R按k個關鍵字進行排序,則需要按照關鍵字的優(yōu)先級次序,由低到高地循環(huán)執(zhí)行上述“分配”和“收集”操作,直到主要關鍵字完成“收集”任務后,即完成所有關鍵字的排序操作。

        2.2? 基于Excelize函數庫實現Excel多關鍵字排序算法

        根據LSD排序算法的設計需要,定義了一種名為SortField的排序關鍵字數據類型,其定義結構如下:

        type SortField struct {

        Name? ?string //排序列的字段名

        Type? ?string //排序類型,是”int”,”float”還是”string”,”user”為自定義序列

        Order? string //排序順序,如果是"desc”為降序,”asc”為升序,”user”為自定義序列

        ColIdx int? ? //排序列的索引號,該值從1起始

        RowIdx int? ? //排序列標題所在行索引,該值從1起始

        Bucket []string //“排序桶”

        CntBkt map[string]int //“計數桶”

        }

        其中,SortField類型的ColIdx和RowIdx兩個字段主要是用于記錄排序列標題所在列號和行號。設置這兩個字段的目的:一是為了防止其他函數對列標題坐標進行重復計算;二是為了在全表數據進行排序的過程中,利用RowIdx數值將標題行排除在外。一方面使標題行不參與排序,從而保證排序數據的準確性,另一方面也減少了排序過程中所分配的存儲空間。

        為SortField關鍵字數據類型綁定一個初始化方法SetSortField (),其方法原型為:

        func (field *SortField) SetSortField(file *excelize.File,sheet,name,sortType,order string,sortData ...[]string) error。其中,參數file用以接受Excelize函數庫讀入的excel文件變量,name,sortType,order 3個參數分別代表排序關鍵字的名字、排序類型和排序順序,其含義已在SortField類型定義中予以說明。sortData為可選字段,當sortType和order兩個參數均為“user”字符串時,sortData字段必須指定待排序列的自定義序列。該方法的執(zhí)行步驟如下:

        (1)使用name, sortType,order 3個變量分別對綁定的*SortField 類型變量field中的name,Type和order 3個字段進行賦值。

        (2)執(zhí)行file.GetCols(sheet)方法從sheet中將讀入的數據存儲到cols變量中。

        (3)調用file.SearchSheet(sheet, name)方法將排序列數據存儲到變量data中。

        (4)調用excelize提供的工具方法CellNameToCoordinates(data[0])獲取排序列標題的坐標,并存入綁定變量field的ColIdx和RowIdx兩個字段中。

        (5)如果field變量的Type字段值為”user”,則調用其綁定方法MakeBucket()并傳入參數sortData[0],構建其“排序桶”Bucket字段 ;否則調用其綁定方法MakeBucket()并傳入參數cols[colNum-1][rowNum:],生成其“排序桶” Bucket字段。

        (6)調用make(map[string]int, len(field.Bucket))函數為field變量的“計數桶”CntBkt字段分配存儲空間。field變量的“計數桶”CntBkt 字段中的key值為其“排序桶”Bucket 的value值,且將“計數桶”CntBkt 的value值初始化為0。

        MakeBucket(data []string)是SortField類型綁定的一個生成“排序桶”的方法,然后根據Order字段的排序順序,完成“排序桶”Bucket的生成,其實現步驟如下:

        (1)調用removeDuplicateElement(data)函數除去data中的重復數據并將結果存入orderData變量中。

        (2)調用make([]string, len(orderData))函數為field.Bucket分配存儲空間;同時調用make([]interface{},0,len(orderData))函數生成排序數據的臨時存儲空間temp。

        (3)根據field.Type的值,對讀取的字符串數據進行類型轉換。如果所傳入的參數值field.Type是字符串類型或“user”類型則不必轉換,否則需要按照原始數據類型對數據進行轉換。然后將數據追加到切片temp中去。

        (4)對轉換后的數據temp通過調用SortOrder(temp,field.Order)函數,按照field.Order字段進行排序。

        (5)將排序后的數據temp轉換為字符串放入“排序桶”field.Bucket中。

        3? ? 結語

        綜上所述,本文以最低位優(yōu)先算法思想為基礎,基于Excelize函數庫設計并實現了能夠滿足Excel工作表數據單關鍵字、多關鍵字和自定義序列排序操作的多關鍵字排序算法。接下來,筆者將進一步研究基于Excelize函數庫,以實現原生Golang中的sort.Interface接口的方法來完成Excel工作表數據的多關鍵字排序問題。

        [參考文獻]

        [1]XU R.介紹·Excelize簡體字文檔[EB/OL].(2021-03-08)[2021-07-03].https://xuri.me/excelize/zh-hans/.

        [2]XU R.性能數據·Excelize簡體字文檔[EB/OL].(2021-03-08)[2021-07-03].https://xuri.me/excelize/zh-hans/performance.html.

        [3]嚴蔚敏,吳偉民.數據結構:C語言版 [M].北京:清華大學出版社,1996.

        (編輯 姚 鑫)

        Design and implementation of Excel multi-keyword sorting algorithm

        based on Excelize function library

        Li Kun, Jia Liwei, Shi Xiaoming

        (Henan Medical College, Zhengzhou 451191, China)

        Abstract:In this paper, based on the Excelize third-party library, aiming at the problem that the current Excelize function library does not implement the sorting function, based on the idea of the LSD algorithm, a multi-keyword sorting algorithm for Excel data is designed and implemented based on the Excelize function library. According to the sorting test results of the actual case, the algorithm can meet the sorting operations of single-keyword, multi-keyword and custom sequence of Excel worksheet. The implementation of the sorting algorithm lays a technical foundation for the design and implementation of the automatic grading system for the course of computer application foundation in the future.

        Key words:Excelize function library; Go language; LSD algorithm; Excel document; multi-keyword sorting

        窝窝午夜看片| 我的美艳丝袜美腿情缘| 一区二区视频中文字幕| 中文字幕一区日韩精品| 99re久久精品国产| 丰满人妻一区二区乱码中文电影网| 亚洲长腿丝袜中文字幕| 亚洲午夜av久久久精品影院色戒| 国产亚洲av综合人人澡精品| 美女污污网站| 国产精品视频一区二区久久| 极品老师腿张开粉嫩小泬| 无套内谢的新婚少妇国语播放| 精品一二区| 国产一区资源在线播放| 色五月丁香五月综合五月| 国产又色又爽无遮挡免费动态图| 福利片免费 亚洲| 人妻少妇艳情视频中文字幕| 东北老女人高潮大喊舒服死了| 色吧综合网| 亚洲一区二区三区av色婷婷| 国产精品女主播福利在线| 男同gay毛片免费可播放| 国产精品国产三级国产专播| 国产丝袜美腿一区二区三区| 国产成人精品2021| 中文幕无线码中文字蜜桃| 五月婷婷激情六月开心| 中文字幕亚洲熟女av| 色老板精品视频在线观看| 国产亚洲精品福利在线| 亚洲成人av一区免费看| 人妻饥渴偷公乱中文字幕| 狠狠色狠狠色综合久久第一次| 一区二区三区在线蜜桃| 国产一区二区三区视频网| 波多野结衣av手机在线观看| 欧美中出在线| 久久丝袜熟女av一区二区| 香蕉人人超人人超碰超国产|