找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1375|回复: 1

[求助] [编程申请]:求助:用lisp实现数据库查找及排序的问题??

[复制链接]
发表于 2003-6-26 00:01:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
各位高手,请问:
    (assoc item alist ) 功能
    从一个关联表中搜索一个元素,若找到则返回此关联表条目。
中的item项能否使用变量,
事例:有一个表,实际上就是一个数据库
(setq tab '((2.0401
             (22500.0 7714.29 24494.4)
             (23259.8 7714.29 24510.2)
             (22500.0 9000.0 24198.9)
             (23259.8 9000.0 24214.3)
            )
            (2.0501
             (22500.0 9000.0 24198.9)
             (23259.8 9000.0 24214.3)
             (22500.0 10285.7 23906.4)
             (23259.5 10285.7 23934.7)
            )
            (2.0601
             (22500.0 10285.7 23906.4)
             (23259.5 10285.7 23934.7)
             (22500.0 11571.4 23719.4)
             (23259.8 11571.4 23737.8)
            )
            (2.0701
             (22500.0 11571.4 23719.4)
             (23259.8 11571.4 23737.8)
             (22500.0 12857.1 23512.9)
             (23259.1 12857.1 23550.2)
            )
           )
)
若用 (assoc 2.0501 tab)
可得  (2.0501 (22500.0 9000.0 24198.9) (23259.8 9000.0 24214.3) (22500.0 10285.7 23906.4) (23259.5 10285.7 23934.7))  很好,
若用 (assoc (+ 2.0401 0.01) tab)
则得到  nil     很失败!

请问在item位置上是否可以接受变量,上面的问题如何解决?

另外,大的表序列中如何进行排序,就像excel中的排序一样,最好还有"主要关键字"“次要关键字”,“第三关键字”的功能,我现在做排序都是先将数据从cad中用lisp写出到文本文件,文本文件再到excel中排序,再用lisp读入,麻烦得很!

还有,建立表的最大容量是多少?我现在的数据大约在5万个左右,会不会溢出,如何解决??

敬请高人指点!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6530个

财富等级: 富甲天下

发表于 2003-6-26 12:47:30 | 显示全部楼层
(assoc item alist)中item项可以输入表达式,如(assoc (+ 2.0 1.01) '((3.01 . 4) (2 . 3)))返回(3.01 . 4),你的情况其实相同,这里应该注意的是,表达式最好不要使用实数计算(我这里也是),这是实数计算的机理,显示2.0501时实际计算结果可能是2.0501000001,也可能是2.0500999999,在实数范围内其实是不等的,assoc中的item应该是相等的项,所以不能保证返回值正确。如果需要使用这种索引,可以将索引项转换为字符串存入表中,也可以使用其他方式检索。使用字符串检索如下:(setq tab '(("2.0401"
(22500.0 7714.29 24494.4)
(23259.8 7714.29 24510.2)
(22500.0 9000.0 24198.9)
(23259.8 9000.0 24214.3))
("2.0501"
(22500.0 9000.0 24198.9)
(23259.8 9000.0 24214.3)
(22500.0 10285.7 23906.4)
(23259.5 10285.7 23934.7)
)))
(assoc (rtos (+ 2.0401 0.0100) 2 4) tab)

对大量的表进行排序可以使用VL函数vl-sort,在alisp中只有使用“冒泡”法了,就是按规律提取表中的项目,将剩下的表作为本表依次提取,构成新表,最好自己编制函数,针对要检索的项操作,必要时进行嵌套,层层剥皮,对大量的表操作要熟练使用mapcar、foreach等函数,可以做的事半功倍。
表的容量就是lisp环境的容量(lisp程序就是一个表),Dos年代是64k,现在一般系统会自动分配,不必担心溢出,不过太大一定会影响运算速度。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 14:25 , Processed in 0.173118 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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