明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3906|回复: 10

关于一个表的双重索引问题

[复制链接]
发表于 2002-9-3 09:15:00 | 显示全部楼层 |阅读模式
有一表,形式如下:
((“A1” “B3”1 2 3 4)
  (“A2” “B7”2 3 4 5)
  (“A3” “B4”3 2 5 7)
  。。。

各子表中的第一项和第二项均为索引,其余项为数据。
我们知道有(ASSOC)可以按第一项索引,找到所要的数据。
请问能按第二项索引,找到所要的数据呢?
(此表很大,有1000多个子表。)
发表于 2002-9-3 11:26:00 | 显示全部楼层

您是否应当创建二维表?

 楼主| 发表于 2002-11-13 16:21:00 | 显示全部楼层

请问,什么是二维表,怎样创建和使用二维表?

发表于 2002-11-14 09:07:00 | 显示全部楼层

用mapcar建立以第二元为索引的新表,可以检索。

发表于 2002-11-14 12:37:00 | 显示全部楼层

回应...

·  二维表
要两个参数(如:型号和序号)才能确定唯一的结果。
从数据结构的合理化和简化上想办法。比如由型号和序号共同确定一组参数:就象向心球轴承一样,205中的2是型号、05是序号。据此,可设计类似下例中的原始数据表,并设计一种适于这类参数表查询的模式。
    (Defun C:SList ()
                    ;型号 对应序号的参数
           (SetQ l '((AJ1 (10 2  4  9 "AJ1-0")
                             (12 4  7 12 "AJ1-1")
                             (14 6 10 19 "AJ1-2")
                             (16 8 14 24 "AJ1-3")
                       )
                       (AJ2 (10  4  8 12 "AJ2-0")
                             (12  6 12 18 "AJ2-1")
                             (14  8 16 22 "AJ2-2")
                             (16 12 20 30 "AJ2-3")
                       )
                       (AJ3 (10  6 10 18 "AJ3-0")
                             (12  8 20 23 "AJ3-1")
                             (14 10 25 30 "AJ3-2")
                             (16 12 30 40 "AJ3-3")
                       )
                     )
           )
           (PrinC "AJ1-x/AJ2-x/AJ3-x, x: 0-3 ...")
           (SetQ s (StrCase (GetString "\nType: "))
                  str (Read (SubStr s 1 3))
                  num (Read (SubStr s 5))
                  l0 (Cdr (Assoc str l))
                  l1 (Nth num l0)
           )
    )

可见,用了自定义结构的、有明确检索项的、参数按序号排列的原始参数表,检索方法就会相当简洁。实际上,要想把程序写得更好,与其在程序描述上追求技巧,不如从数据结构这一根本性问题上设想出更好的方案,上例就是证明。为能表达清楚检索的各步骤,源程序写得比较啰嗦,数据表的提取应是:
(SetQ l1 (Nth num (Cdr (Assoc str l))))

摘自《Visual LISP程序设计——技巧与范例》第五章
 楼主| 发表于 2002-11-14 14:46:00 | 显示全部楼层

明白了,不过这个表的结构是不同的。

可能是我没有说清楚,给大家造成了误解。
((“A1” “B3”1 2 3 4)
  (“A2” “B7”2 3 4 5)
  (“A3” “B4”3 2 5 7)
  。。。

其实在表中,第一项和第二项是一一对应的,而不是嵌套关系。
A1--B3,A2--B7,A3--B4。。。
一般时都按第一项来索引,这时第二项和后面的所有项都做为数据。
但有时需要用第二项来索引,这时第一项和后面的所有项做为数据。
第一项和第二项都为字符串,我不能区分每次索引时是在用第一项还是用第二项,所以我想在程序中这样用
(if (setq return (assoc 索引 原表))
    (setq return return)
    (setq return (按第二项索引结果)
)
发表于 2002-11-14 19:42:00 | 显示全部楼层

vl-remove-if-not

查询条件:=a1
原表:lst
(vl-remove-if-not '(lambda (x) (or (= (car x) a1)
                                   (= (cadr x) a1)
                                )
                   )
                   lst
)
发表于 2002-11-14 20:50:00 | 显示全部楼层

(assoc "B7" (mapcar 'cdr list))

发表于 2002-11-15 09:00:00 | 显示全部楼层

什么样的工程设计需要,造成这种结构?

 楼主| 发表于 2002-11-15 10:53:00 | 显示全部楼层

型钢数据中的应用

每一种型钢都有一组数据,包括各个方向和部分的尺寸。
在通常情况下,所有尺寸都用英寸来表示,包括型钢的型号(既索引项)也用英寸来表示。可是现在所有的尺寸都要换成公制的数据,既用毫米来表示。包括型钢的型号也要用毫米来表示。
型钢并没有改变,一种型钢要对应英寸和毫米两种数据。
无论是按英寸还是按毫米来查寻,都应该把这两种数据同时提取出来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 21:30 , Processed in 0.191444 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表