• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于Excelize函數(shù)庫(kù)Excel多關(guān)鍵字排序算法的設(shè)計(jì)與實(shí)現(xiàn)

      2021-09-26 02:59:43李琨賈立偉石曉明
      無(wú)線互聯(lián)科技 2021年15期

      李琨 賈立偉 石曉明

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

      關(guān)鍵詞:Excelize函數(shù)庫(kù);Go語(yǔ)言;LSD算法;Excel工作簿;多關(guān)鍵字排序

      0? ? 引言

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

      本文在前期基于Excelize函數(shù)庫(kù)對(duì)復(fù)雜Excel工作簿的讀寫(xiě)操作測(cè)試的基礎(chǔ)上,針對(duì)Excelize函數(shù)庫(kù)目前沒(méi)有實(shí)現(xiàn)排序函數(shù)的這個(gè)問(wèn)題,以最低位優(yōu)先算法(LSD算法)[3]思想為基礎(chǔ),基于Excelize函數(shù)庫(kù)設(shè)計(jì)并實(shí)現(xiàn)了Excel數(shù)據(jù)的多關(guān)鍵字排序算法。該排序算法的實(shí)現(xiàn)為今后設(shè)計(jì)并實(shí)現(xiàn)“計(jì)算機(jī)應(yīng)用基礎(chǔ)”課程自動(dòng)判卷系統(tǒng)進(jìn)一步奠定了技術(shù)基礎(chǔ)。

      1? ? 基于Excelize函數(shù)庫(kù)實(shí)現(xiàn)Excel數(shù)據(jù)多關(guān)鍵字排序面臨的問(wèn)題

      Excelize函數(shù)庫(kù)提供了大量操作Excel工作簿讀寫(xiě)的函數(shù)和方法。因?yàn)镋xcel工作表是按行數(shù)據(jù)進(jìn)行排序的,所以需要通過(guò)Excelize函數(shù)庫(kù)提供的GetRows()方法從Excel工作簿中讀取所有數(shù)據(jù)。但是,GetRows()方法返回的數(shù)據(jù)結(jié)果為二維字符串切片,使得無(wú)論工作表中的數(shù)據(jù)為何種類型,得到的結(jié)果均為字符串類型。這樣就使得對(duì)數(shù)據(jù)的操作存在以下3個(gè)方面的難題:(1)讀取的數(shù)據(jù)均存儲(chǔ)為字符串類型,無(wú)法利用程序自動(dòng)判斷原數(shù)據(jù)的數(shù)據(jù)類型,降低了軟件的自動(dòng)化程度。(2)假設(shè)排序關(guān)鍵字所在列為數(shù)值型數(shù)據(jù),而讀取后的結(jié)果卻為字符串類型,需進(jìn)行類型轉(zhuǎn)換操作,否則排序結(jié)果不正確。(3)當(dāng)排序結(jié)束后,需要將排序結(jié)果寫(xiě)回到Excel工作表中,此時(shí)需要將每一列數(shù)據(jù)由字符串類型轉(zhuǎn)換為原類型的數(shù)據(jù),否則將改變?cè)紨?shù)據(jù)的數(shù)據(jù)類型。

      2? ? 基于Excelize函數(shù)庫(kù)Excel多關(guān)鍵字排序算法的設(shè)計(jì)與實(shí)現(xiàn)

      2.1? 基于Excelize函數(shù)庫(kù)設(shè)計(jì)Excel多關(guān)鍵字排序算法

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

      2.2? 基于Excelize函數(shù)庫(kù)實(shí)現(xiàn)Excel多關(guān)鍵字排序算法

      根據(jù)LSD排序算法的設(shè)計(jì)需要,定義了一種名為SortField的排序關(guān)鍵字?jǐn)?shù)據(jù)類型,其定義結(jié)構(gòu)如下:

      type SortField struct {

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

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

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

      ColIdx int? ? //排序列的索引號(hào),該值從1起始

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

      Bucket []string //“排序桶”

      CntBkt map[string]int //“計(jì)數(shù)桶”

      }

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

      為SortField關(guān)鍵字?jǐn)?shù)據(jù)類型綁定一個(gè)初始化方法SetSortField (),其方法原型為:

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

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

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

      (3)調(diào)用file.SearchSheet(sheet, name)方法將排序列數(shù)據(jù)存儲(chǔ)到變量data中。

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

      (5)如果field變量的Type字段值為”user”,則調(diào)用其綁定方法MakeBucket()并傳入?yún)?shù)sortData[0],構(gòu)建其“排序桶”Bucket字段 ;否則調(diào)用其綁定方法MakeBucket()并傳入?yún)?shù)cols[colNum-1][rowNum:],生成其“排序桶” Bucket字段。

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

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

      (1)調(diào)用removeDuplicateElement(data)函數(shù)除去data中的重復(fù)數(shù)據(jù)并將結(jié)果存入orderData變量中。

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

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

      (4)對(duì)轉(zhuǎn)換后的數(shù)據(jù)temp通過(guò)調(diào)用SortOrder(temp,field.Order)函數(shù),按照f(shuō)ield.Order字段進(jìn)行排序。

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

      3? ? 結(jié)語(yǔ)

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

      [參考文獻(xiàn)]

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

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

      [3]嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu):C語(yǔ)言版 [M].北京:清華大學(xué)出版社,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

      乐东| 二手房| 通州市| 阿克陶县| 凤冈县| 兰州市| 中牟县| 西乡县| 永顺县| 金坛市| 万山特区| 朝阳县| 巴塘县| 仙居县| 班戈县| 灌云县| 崇州市| 怀来县| 霞浦县| 古蔺县| 通化市| 东乡| 赣州市| 钦州市| 商洛市| 兴隆县| 黑山县| 宜城市| 平南县| 广东省| 高要市| 荆州市| 九台市| 广平县| 罗城| 廊坊市| 阳高县| 台南县| 香港| 远安县| 海伦市|