close
Table關聯表使用說明和方法
關聯表是一個廣義的陣列,鍵/值對的集合。
Skill數據可以用來作為鍵表中的類型是整數,浮點,字符串,列表,標誌,和實例某些用戶定義的類型,
在V15.7以下不能使用物件的dbid,
而在V16.x以上就可以使用漸漸的dbid做為一個鍵。
關聯表被作為哈希表(雜湊表 hash table)內部實現。
關聯表,您可以查找與技巧的數據類型的有效實例的任何條目。數據
存儲在鍵/值對可以與語法的標準陣列訪問快速訪問
以及各種迭代功能。這種訪問是基於使用該技能相等的系統上
功能鍵進行比較。
關聯表提供便利和性能無法在無形的財產
列表,數組或關聯表。無形的屬性列表和公會列表是不
有效的情況下,其內容可以極大地擴展。此外,在使用符號
在無形的屬性列表屬性或鍵可以浪費。一個簡單的轉換
過程將無形的財產清單和關聯列表來關聯表。一個
關聯表也可以被轉換為關聯對的列表。
初始化表
該makeTable函數定義並初始化關聯表。此功能需要一個單個字符串參數作為印刷目的表名。
可選的第二個參數時提供一個查詢表中產生不匹配,返回的默認值。
該tablep謂詞驗證一個表的數據類型,以及長度函數確定在表中的鍵的數目。
要引用,並添加元素,使用語法標準陣列訪問。
下面的示例創建一個表,並將其與按鍵負載和相關的值對數字和顏色的彩色地圖。
鍵可以是任何前面提到的數據類型;它們並不限於數字數據類型。
myTable = makeTable("atable1" 0) => table:atable1
tablep(myTable) => t
myTable[1] = "blue" => "blue"
myTable["two"] = '(r e d) => (r e d)
myTable["three"] = 'green => green
length(myTable) => 3
如果一個新的對被添加到表中,但是它的鍵已存在,新值替換現有
在表中的值。
如果要訪問的鍵不存在,則處理返回任一指定的默認值
在創建表或符號綁定,如果沒有指定缺省值。
操縱表數據
在foreach,forall,和setof功能掃描的關聯表的內容和
每個鍵及其關聯值performiterative編程功能。標準輸入
和輸出功能都可以通過readTable,writeTable和printstruct
功能。
在附加功能附加在現有無形的財產清單或關聯數據
列出了現有關聯表。您指定的關聯表(與創建
makeTable功能)作為該函數的第一個參數。對於第二個參數,你
指定無形的財產清單,關聯列表,或其他關聯表,其數據
要追加。
關聯表的功能
一些面向列表的功能,也可以用在表,包括迭代。
List-Oriented Functions for Tables
--------------------------------------------------------------------------------
Use this To do this
--------------------------------------------------------------------------------
Syntax for array access To store and retrieve entries in a table
makeTable function To create and initialize the association table. The arguments
are the table name (required) and (optional) the default
value to return for keys not present in the table. The default
is unbound.
foreach function To execute a collection of SKILL expressions for each key/
value pair in a table
setof function To return a list of keys in a table that satisfy a criterion.
length function To return the number of key/value pairs in a table
remove function To remove a key from a table
--------------------------------------------------------------------------------
測試無論是數據值是一個表(tablep)
使用tablep功能測試的數據值是否是一個表。
myTable = makeTable("atable1" 0) => table:atable1
tablep(myTable) => t
tablep(9) => nil
轉換的關聯表的內容,關聯表(tableToList)
該功能可以消除您從引用的數據中獲得的關聯效率
表。不要使用此函數進行處理數據的關聯表。相反,使用本
交互功能看一個表的內容。
tableToList(myTable)
=> (("two" (r e d)) ("three" green) (1 "blue"))
寫作的關聯表的內容到一個文件(writeTable)
該writeTable功能是用於寫入存儲在一個協會基本功數據類型
表。的功能可以不寫數據庫對象或可能是其他的用戶定義類型
存儲在關聯表。
writeTable("inventory.log" myTable) => t
追加的文件的內容,以現有的關聯表(readTable)
該文件必須已創建與writeTable功能,使得內容是在一個
可用的格式。
readTable("inventory.log" myTable)=> t
打印一個對象的內容以表格格式(printstruct)
對於調試,printstruct功能打印結構的內容以易於閱讀
形式。它遞歸地打印嵌套結構。
printstruct(myTable)
=> 1: "blue"
"three": green
"two": (r e d)
遍歷關聯表
使用的foreach函數來參觀的關聯表中的每個關鍵。例如,使用
下面的函數調用打印每個鍵/值對表。
foreach( key myTable
println(list( key myTable[ key ] ))
)
您也可以使用該功能FORALL,存在和SETOF遍歷關聯表。 (這些
詳細“高級列表操作”175頁上的功能說明)
例如,使用下面的函數調用來測試,如果每一個鍵/值對在一個表中是這樣
該密鑰是一個字符串,值是一個整數。
forall( key myTable
stringp(key) && fixp(myTable[key])
)
要檢查是否存在滿足以上表達式一對,調用下列功能。
exists( key myTable
stringp(key) && fixp(myTable[key])
)
To write the entire contents of a table to a file, use writeTable.
To read a file (created using writeTable), use readTable.
To view the contents of a table, use printstruct.
在附加功能附加在現有無形的財產清單或關聯數據
列出了現有關聯表。
怎么拷贝table的数据而不改变原table的数据呢
在使用newTable = oldTable后
发现对newTable进行操作后,oldTable也同样变化了
说明skill针对 newTable = oldTable 不是常规意义上的赋值,而是复制数据地址
也就是newTable完全等同于oldTable
怎样才能利用table内的数据,但是不改变原table的数据呢?(原数据需要针对不同情况进行调整,所以原始数据不能改变)
发现对newTable进行操作后,oldTable也同样变化了
说明skill针对 newTable = oldTable 不是常规意义上的赋值,而是复制数据地址
也就是newTable完全等同于oldTable
怎样才能利用table内的数据,但是不改变原table的数据呢?(原数据需要针对不同情况进行调整,所以原始数据不能改变)
=>解決方式
;拷貝一份原來的值
for(xKey 1 length(oldTable)
newTable[xKey] = copy(oldTable[xKey])
)
for(xKey 1 length(oldTable)
newTable[xKey] = copy(oldTable[xKey])
)
我原本使用的table的array并不是数字,而是任意的字符串
也就是
lName = sprintf(nil "%.2f(%s)" width layer)
lw[lName] = axlDBGetLength(seg) + lw[lName]
难道我需要把所有的lName记录下来?
对不同的线宽和层面做长度的累加,遇到分支后分别累加长度
也就是
lName = sprintf(nil "%.2f(%s)" width layer)
lw[lName] = axlDBGetLength(seg) + lw[lName]
难道我需要把所有的lName记录下来?
对不同的线宽和层面做长度的累加,遇到分支后分别累加长度
=>
foreach(sKey oldTable->?
newTable[sKey] = copy(oldTable[sKey])
newTable[sKey] = copy(oldTable[sKey])
)
=>
lwx = makeTable("lwx" 0)
foreach(lName lw->? lwx[lName] = lwx[lName] + lw[lName])
文章標籤
全站熱搜
留言列表