📜  Q语言-属性

📅  最后修改于: 2020-11-03 06:54:38             🧑  作者: Mango


表的列表,字典或列可以将属性应用到它们。属性将某些属性强加在列表上。某些属性在修改时可能会消失。

属性类型

排序(`s#)

s#表示列表按升序排序。如果列表由asc(或xasc)显式排序,则该列表将自动具有已排序的属性集。

q)L1: asc 40 30 20 50 9 4

q)L1
`s#4 9 20 30 40 50

已知要排序的列表也可以具有明确设置的属性。 Q将检查列表是否已排序,否则,将抛出s-fail错误。

q)L2:30 40 24 30 2

q)`s#L2
's-fail

如果未排序,追加的属性将丢失。

分手(`p#)

p表示将列表分开,并且相同的项目连续存储。

范围是具有基本int值(例如,年,月,日等)的int时间类型。您也可以对符号进行分区(如果已枚举)。

应用parted属性将创建一个索引字典,该字典将每个唯一输出值映射到其首次出现的位置。分开列表后,查找速度要快得多,因为线性搜索已替换为哈希表查找。

q)L:`p# 99 88 77 1 2 3

q)L
`p#99 88 77 1 2 3

q)L,:3

q)L
99 88 77 1 2 3 3

注意-

  • 即使该操作保留了分区,parted属性也不会保留在列表上的某个操作下。

  • 当实体的数量达到10亿且大多数分区的大小很大时,即存在大量重复时,应考虑parted属性。

分组(`g#)

g表示列表已分组。建立并维护了一个内部字典,该字典将每个唯一项映射到其每个索引,这需要大量存储空间。对于包含u个大小为s的唯一项的长度为L的列表,这将是(L×4)+(u×s)个字节。

如果无法对列表进行其他假设,则可以将其应用于列表。

该属性可以应用于任何类型的列表。它在追加中维护,但在删除时丢失。

q)L: `g# 1 2 3 4 5 4 2 3 1 4 5 6

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6

q)L,:9

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6 9

q)L _:2

q)L
1 2 4 5 4 2 3 1 4 5 6 9

唯一(`#u)

将唯一属性(u#)应用于列表表示该列表的各项是不同的。知道列表中的元素是唯一的,可以极大地加快区分速度,并使q尽早执行一些比较。

当列表标记为唯一时,将为列表中的每个项目创建一个内部哈希图。列表中的操作必须保留唯一性,否则属性将丢失。

q)LU:`u#`MSFT`SAMSUNG`APPLE

q)LU
`u#`MSFT`SAMSUNG`APPLE

q)LU,:`IBM                        /Uniqueness preserved

q)LU
`u#`MSFT`SAMSUNG`APPLE`IBM

q)LU,:`SAMSUNG                    / Attribute lost

q)LU
`MSFT`SAMSUNG`APPLE`IBM`SAMSUNG

注意-

  • u#在保留唯一性的级联中保留。在删除和非唯一串联时丢失。

  • 在u#列表上的搜索是通过哈希函数的。

删除属性

可以通过应用#来删除属性。

应用属性

应用属性的三种格式是-

  • L:`s#14 2 3 3 9 /在创建列表时指定

  • @ [`。; `L; `s#] /功能适用,即适用于变量列表L

    /在默认名称空间(即`。)中适用

    /排序后的`s#属性

  • 从`tab更新`s#time

    /更新表格(标签)以应用

    /属性。

让我们将以上三种不同的格式应用于示例。

q)/ set the attribute during creation

q)L:`s# 3 4 9 10 23 84 90

q)/apply the attribute to existing list data

q)L1: 9 18 27 36 42 54

q)@[`.;`L1;`s#]
`.

q)L1                 / check
`s#9 18 27 36 42 54

q)@[`.;`L1;`#]       / clear attribute
`.

q)L1
9 18 27 36 42 54

q)/update a table to apply the attribute

q)t: ([] sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t:([]time:09:00 09:30 10:00t;sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t

    time         sym    mcap
---------------------------------
  09:00:00.000   ibm    9000
  09:30:00.000   msft   18000
  10:00:00.000  samsung 27000

q)update `s#time from `t
`t

q)meta t               / check it was applied

    c  | t f a
------ | -----
  time | t s
  sym  | s
  mcap | j
  
Above we can see that the attribute column in meta table results shows the time column is sorted (`s#).