乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 88|回复: 4

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

[复制链接]

5

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
34
发表于 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多个子表。)
回复

使用道具 举报

22

主题

248

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
336
发表于 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程序设计——技巧与范例》第五章
回复

使用道具 举报

5

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
34
发表于 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 (按第二项索引结果)
)
回复

使用道具 举报

14

主题

72

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

5

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
34
发表于 2002-11-15 10:53:00 | 显示全部楼层
每一种型钢都有一组数据,包括各个方向和部分的尺寸。
在通常情况下,所有尺寸都用英寸来表示,包括型钢的型号(既索引项)也用英寸来表示。可是现在所有的尺寸都要换成公制的数据,既用毫米来表示。包括型钢的型号也要用毫米来表示。
型钢并没有改变,一种型钢要对应英寸和毫米两种数据。
无论是按英寸还是按毫米来查寻,都应该把这两种数据同时提取出来。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-5-28 01:17 , Processed in 3.516737 second(s), 62 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表