AutoHotKey偽數(shù)組趴久、數(shù)組與關(guān)聯(lián)數(shù)組

數(shù)組.jpg

前邊我們講了變量丸相,打了一個(gè)形象的比喻,就是把變量比作吃飯的碗彼棍,量(值)就是飯灭忠。其實(shí)呢,數(shù)組跟變量是有直接關(guān)系的座硕,變量是數(shù)組的基礎(chǔ)弛作,變量的是碗的話,數(shù)組就好像是一個(gè)多功能的飯盒华匾,可以同時(shí)裝好多種飯菜映琳,神奇吧!蜘拉!

來吧萨西!然我們一起領(lǐng)略一下數(shù)組的神奇。常見的數(shù)組有三種旭旭,偽數(shù)組谎脯、數(shù)組、關(guān)聯(lián)數(shù)組持寄。

偽數(shù)組

偽數(shù)組應(yīng)該是AutoHotkey中特有的概念源梭,每個(gè)偽數(shù)組實(shí)際上只是一系列連續(xù)編號(hào)的變量或函數(shù)的集合娱俺,它們的每一個(gè)被視為偽數(shù)組的“元素”。AutoHotkey 內(nèi)部不會(huì)以任何方式把這些元素鏈接在一起废麻。任何接受 OutputVar 或能賦值的命令都可以用來創(chuàng)建偽數(shù)組矢否。
最簡(jiǎn)單的例子是使用賦值運(yùn)算符(:=),如下所示:
Array%j% := A_LoopField
通過在索引間使用自選分隔符可以創(chuàng)建多維偽數(shù)組脑溢,例如:
Array%j%_%k% := A_LoopReadLine

操作偽數(shù)組下面的例子演示了如何創(chuàng)建和訪問偽數(shù)組僵朗,這里是從文本文件獲取一系列的名稱:

; 例1:寫入數(shù)據(jù)到偽數(shù)組:
ArrayCount := 0
Loop, Read, C:\Test.txt   ; 循環(huán)獲取文件中的每行,一次一行屑彻。
{
    ArrayCount += 1  ; 記錄偽數(shù)組中的項(xiàng)目數(shù)验庙,這里不記錄后面獲取不方便。
    Array%ArrayCount% := A_LoopReadLine  ; 把此行保存到偽數(shù)組中的下一個(gè)元素社牲。
}

; 例2:從偽數(shù)組中讀确嘌Α:
Loop, %ArrayCount%
{
    ; 下一行使用 := 運(yùn)算符獲取偽數(shù)組元素:
    element := Array%A_Index%  ; A_Index 是內(nèi)置變量。
    MsgBox, % "索引號(hào)" . A_Index . "的元素的值為" . Array%A_Index%
}

看過這兩個(gè)例子后搏恤,里面的操作中我們只是連續(xù)的操作變量罷了违寿,與操作普通變量在性質(zhì)上沒有區(qū)別。唯一的區(qū)別是名稱熟空,這系列變量的名稱一般后面部分為數(shù)字藤巢,比較典型的如 StringSplit、WinGet ListRegExMatch 這些命令創(chuàng)建的偽數(shù)組息罗。還有些命令雖然會(huì)創(chuàng)建一系列變量掂咒,變量的名稱卻不是以數(shù)字結(jié)尾,如 GuiControlGet Pos迈喉、SysGet 等绍刮。

數(shù)組

簡(jiǎn)單數(shù)組創(chuàng)建數(shù)組:

Array := [Item1, Item2, ..., ItemN]
Array := Array(Item1, Item2, ..., ItemN)

獲取項(xiàng):

Value := Array[Index]

對(duì)項(xiàng)進(jìn)行賦值:

Array[Index] := Value

插入一個(gè)或多個(gè)東東到給定序號(hào)位置:

Array.InsertAt(Index, Value, Value2, ...)

追加一個(gè)或多個(gè)東東:

Array.Push(Value, Value2, ...)

移除項(xiàng):

RemovedValue := Array.RemoveAt(Index)

移除最后一項(xiàng):

RemovedValue := Array.Pop()

如果數(shù)組不是空的, 那么 MinIndexMaxIndex/Length 分別返回?cái)?shù)組中當(dāng)前使用的最小和最大的索引. 由于最小的索引幾乎總是 1, 所以 MaxIndex 經(jīng)常返回項(xiàng)目數(shù). 如果沒有整數(shù)鍵, MaxIndex 返回空而 Length 返回 0 ,對(duì)數(shù)組內(nèi)容進(jìn)行依次循環(huán)可以通過索引或 For 循環(huán)實(shí)現(xiàn)。
例如:

array := ["one", "two", "three"]

; 從 1 到項(xiàng)目數(shù)進(jìn)行重復(fù):
Loop % array.Length()
    MsgBox % array[A_Index]

; 枚舉數(shù)組內(nèi)容:
For index, value in array
    MsgBox % "Item " index " is '" value "'"

關(guān)聯(lián)數(shù)組

關(guān)聯(lián)數(shù)組是一種數(shù)據(jù)結(jié)構(gòu)挨摸,本質(zhì)上是一種特殊的對(duì)象孩革。操作關(guān)聯(lián)數(shù)組自包含關(guān)聯(lián)數(shù)組可以使用以下兩種創(chuàng)建
<pre>Array := {KeyA: ValueA, KeyB: ValueB, ..., KeyZ: ValueZ}
Array := Object("KeyA", ValueA, "KeyB", ValueB, ..., "KeyZ", ValueZ)</pre>

例如:

; 創(chuàng)建數(shù)組后,初始為空:
Array := Object()

; 寫入數(shù)據(jù)到數(shù)組:
Loop, Read, C:\Guest List.txt ; 依次獲取文件中的每行文本得运。
{
    Array.Insert(A_LoopReadLine) ; 添加到數(shù)組中膝蜈。
}

; 從數(shù)組中讀取數(shù)據(jù),在一般情況下建議使用這種方式(即 for 循環(huán)):
for index, element in Array
{
    MsgBox, % "索引號(hào)為" . index . "的元素的值為" . element
}

這個(gè)例子僅演示了對(duì)象提供的功能中很小的一部分澈圈,還可以可以設(shè)置彬檀、獲取、插入瞬女、移除和枚舉項(xiàng)目。除了數(shù)字努潘,還可以把字符串和對(duì)象作為鍵使用诽偷。對(duì)象可以作為值存儲(chǔ)到其他對(duì)象中并且可以作為函數(shù)參數(shù)或返回值傳遞坤学。對(duì)象還可以用新功能進(jìn)行擴(kuò)展。

For 循環(huán)與 Loop 循環(huán)

對(duì)于這樣特殊的關(guān)聯(lián)數(shù)組报慕,還可以把上面的 For 循環(huán)替換為 Loop 循環(huán):
; 使用傳統(tǒng)方式

Loop, % Array.MaxIndex()
{
    ; 使用“Loop”深浮,索引必須是連續(xù)的數(shù)字,從 1 到數(shù)組中元素的個(gè)數(shù)(或者必須在循環(huán)中進(jìn)行計(jì)算)眠冈。
    MsgBox, % "索引號(hào)為" . A_Index . "的元素的值為" . Array[A_Index]
}

實(shí)際上不建議使用 Loop 對(duì)關(guān)聯(lián)數(shù)組進(jìn)行循環(huán)操作(很蹩腳)飞苇,上面的例子中數(shù)組的索引從 1 開始且是連續(xù)的整數(shù),所以可以使用 Loop 循環(huán)蜗顽。然而布卡,關(guān)聯(lián)數(shù)組中的鍵可以為字符串、整數(shù)或?qū)ο蠊透牵词规I為整數(shù)時(shí)還可能是稀疏分布的忿等,例如{1:"a",1000:"b"},在這些一般情況下都無法使用 Loop 代替崔挖。

數(shù)組贸街、偽數(shù)組與關(guān)聯(lián)數(shù)組的之間的比較和應(yīng)用

盡管 Insert() 和枚舉數(shù)有它們的用途, 不過一些用戶可能會(huì)發(fā)現(xiàn)使用它們比用更傳統(tǒng)的方式容易些。下面的例子中把偽數(shù)組和關(guān)聯(lián)數(shù)組的操作方式進(jìn)行比較狸相,其中注釋中的為偽數(shù)組的操作方式:

; 與變量可直接使用不同薛匪,數(shù)組在使用前必須初始化:
Array := Object()

; Array%j% := A_LoopField
Array[j] := A_LoopField

; Array%j%_%k% := A_LoopReadLine
Array[j, k] := A_LoopReadLine

ArrayCount := 0
Loop, Read, C:\Guest List.txt
{
    ArrayCount += 1
    ; Array%ArrayCount% := A_LoopReadLine
    Array[ArrayCount] := A_LoopReadLine
}

Loop, %ArrayCount%
{
    ; element := Array%A_Index%
    element := Array[A_Index]
    ; MsgBox % "Element number " . A_Index . " is " . Array%A_Index%
    MsgBox, % "Element number " . A_Index . " is " . Array[A_Index]
}

這個(gè)是幫助中的例子,但實(shí)際意義不大脓鹃,因?yàn)樗且詡螖?shù)組的方式在偽數(shù)組的功能上進(jìn)行的比較蛋辈。例如使用 ArrayCount 變量保存數(shù)組元素個(gè)數(shù),我們知道這對(duì)于關(guān)聯(lián)數(shù)組是多余的将谊,它的元素個(gè)數(shù)是由程序維護(hù)冷溶,可以直接使用 MaxIndex() 方法獲取,而且獲取值時(shí)無需通過元素個(gè)數(shù)尊浓,可直接 for 循環(huán)逞频。幫助中提到這個(gè)比較會(huì)“讓大家更容易從原來使用偽數(shù)組的習(xí)慣中過渡過來”,不過我個(gè)人認(rèn)為這樣做是否像用漢字標(biāo)出英語單詞的發(fā)音來學(xué)英語呢栋齿?
關(guān)聯(lián)數(shù)組使用與簡(jiǎn)單數(shù)組非常相似的語法. 事實(shí)上, 在 v1.x 中它們是相同的東西. 然而, 把 [] 視為簡(jiǎn)單線性數(shù)組有助于保持其作用清晰, 并且改善您腳本與 AutoHotkey 未來版本的兼容性, 未來版本中可能改變實(shí)現(xiàn)方式.

小結(jié)

目前而言苗胀,在支持創(chuàng)建偽數(shù)組的命令中還是需要偽數(shù)組(偽數(shù)組存在的必要性),在其他地方關(guān)聯(lián)數(shù)組具有優(yōu)勢(shì)(關(guān)聯(lián)數(shù)組的功能強(qiáng)大瓦堵、使用方便)基协,即關(guān)聯(lián)數(shù)組尚無法完全取代偽數(shù)組(即使作為中間產(chǎn)物),盡管我推薦在一般情況下使用關(guān)聯(lián)數(shù)組菇用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澜驮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惋鸥,更是在濱河造成了極大的恐慌杂穷,老刑警劉巖悍缠,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耐量,居然都是意外死亡飞蚓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門廊蜒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趴拧,“玉大人,你說我怎么就攤上這事山叮≈瘢” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵聘芜,是天一觀的道長(zhǎng)兄渺。 經(jīng)常有香客問我,道長(zhǎng)汰现,這世上最難降的妖魔是什么挂谍? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瞎饲,結(jié)果婚禮上口叙,老公的妹妹穿的比我還像新娘。我一直安慰自己嗅战,他們只是感情好妄田,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驮捍,像睡著了一般疟呐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上东且,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天启具,我揣著相機(jī)與錄音,去河邊找鬼珊泳。 笑死鲁冯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的色查。 我是一名探鬼主播薯演,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼秧了!你這毒婦竟也來了跨扮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎好港,沒想到半個(gè)月后愉镰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米罚,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钧汹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了录择。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拔莱。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隘竭,靈堂內(nèi)的尸體忽然破棺而出塘秦,到底是詐尸還是另有隱情,我是刑警寧澤动看,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布尊剔,位于F島的核電站,受9級(jí)特大地震影響菱皆,放射性物質(zhì)發(fā)生泄漏须误。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一仇轻、第九天 我趴在偏房一處隱蔽的房頂上張望京痢。 院中可真熱鬧,春花似錦篷店、人聲如沸祭椰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽方淤。三九已至,卻和暖如春蹄殃,著一層夾襖步出監(jiān)牢的瞬間携茂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工窃爷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑蒋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓按厘,卻偏偏與公主長(zhǎng)得像医吊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逮京,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 作者:amnesiac 首發(fā):官方論壇之中文版 偽數(shù)組應(yīng)該是 AutoHotkey 中特有的概念卿堂,下面的內(nèi)容需要稍...
    amnesiac閱讀 598評(píng)論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法草描,繼承相關(guān)的語法览绿,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • 第一部分 打好基礎(chǔ) Laying the Foundation 第一章 歡迎進(jìn)入軟件構(gòu)建的世界 Welcome t...
    白樺葉閱讀 4,608評(píng)論 0 17
  • 楊孜 你我相距 何止千里 但妳的東邊日出 卻讓我西邊下雨 妳霸占分分秒秒 臨幸著幾世修為 我的花花草草 錦繡文章 ...
    楊孜閱讀 299評(píng)論 0 0
  • 三月穗慕,情未央饿敲,花開,傾城逛绵。 沿著三月的時(shí)光怀各,我翻閱著曾經(jīng),那一份初相遇术浪,晚春瓢对,初夏,那些濃濃的情懷胰苏,也便兀...
    一指流沙1閱讀 216評(píng)論 2 2