今天在写一个仓库管理的软件,把混拼搜索写了。因为易语言的自带提示很坑*,多年积累的怨言,现在凑巧写了个混拼的,比你想象中要强大。(呃,广告词,其实并没有怎么考虑各种突发情况的效率,但功能是有的,一般的效率也是有的,大神有机会帮忙看看有没有啥问题,或者提提怎么写更好)
下面的图片不是特意截得,只是跟朋友说的时候,随手截给他看的。因为我不是主要在写混搜...懒得再截了
先放易语言让我不爽的,貌似只支持纯首拼或双拼..
(单纯的只是不爽,接下来的行动对这个不爽并没啥改变)
。。。。。单拼不能接双拼...
先不说必须输入_好麻烦,尤其是在中文环境需要切换输入法,当然,据说可以宏定义键盘
这忍了。
但是......双拼完之后不允许首拼...
我这么长的怎么输...前缀还一样一样的
所以我想支持拼音混合,容许遗漏,模糊搜索
这个用来选择的时候有奇效
比如仓库里有两百多件不同名字的材料。
。。。。。。以上都是节选自聊天记录,懒得打字
忽略分析过程了..总之就是准备提取出两串拼音来顺序匹配,加上数字和字母,忽略其他符号
大概就是这样。
写出来之后给朋友的截图是
就这样咯...
- .版本 2
- .程序集 窗口程序集_启动窗口
- .程序集变量 数组, 文本型, , "0"
- .子程序 _编辑框_搜索内容_内容被改变
- .局部变量 i, 整数型
- .局部变量 文本, 文本型
- .局部变量 搜索文本拼音, 文本型
- .局部变量 原串拼音, 文本型
- .局部变量 原长, 整数型
- .局部变量 搜索位置, 整数型
- .局部变量 临时数组, 文本型, , "0"
- 编辑框_搜索结果.内容 = “”
- .如果真 (编辑框_搜索内容.内容 ≠ “”)
- 搜索文本拼音 = 取文本拼音 (编辑框_搜索内容.内容)
- 原长 = 取文本长度 (搜索文本拼音)
- .如果真 (原长 = 0)
- 返回 ()
- .如果真结束
- .计次循环首 (取数组成员数 (数组), i)
- 原串拼音 = 取文本拼音 (数组 [i])
- .如果真 (取文本长度 (原串拼音) ≥ 原长 且 原长 > 0 且 顺序是否匹配 (原串拼音, 搜索文本拼音))
- 文本 = 文本 + 数组 [i] + #换行符
- .如果真结束
- .计次循环尾 ()
- .如果真结束
- 编辑框_搜索结果.内容 = 文本
- .子程序 顺序是否匹配, 逻辑型
- .参数 原字符串, 文本型
- .参数 新字符串, 文本型
- .局部变量 寻找位置, 整数型
- ' 调试输出 (原字符串, 新字符串)
- .如果真 (新字符串 = “”)
- ' 调试输出 (原字符串, “ok”)
- 返回 (真)
- .如果真结束
- 寻找位置 = 寻找文本 (原字符串, 取文本左边 (新字符串, 1), , 假)
- .如果真 (寻找位置 ≠ -1)
- 返回 (顺序是否匹配 (取文本右边 (原字符串, 取文本长度 (原字符串) - 寻找位置), 取文本右边 (新字符串, 取文本长度 (新字符串) - 1)))
- .如果真结束
- 返回 (假)
- .子程序 取文本拼音, 文本型
- .参数 文本, 文本型
- .局部变量 文本数组, 文本型, , "0"
- .局部变量 i, 整数型
- .局部变量 拼音, 文本型
- 功能_逐字分割 (文本, 文本数组)
- ' 调试输出 (文本数组)
- .计次循环首 (取数组成员数 (文本数组), i)
- 拼音 = 拼音 + 选择 (判断单字符是否字母数字 (文本数组 [i]), 文本数组 [i], 取拼音 (文本数组 [i], 1))
- .计次循环尾 ()
- 返回 (拼音)
- .子程序 判断单字符是否字母数字, 逻辑型
- .参数 字符, 文本型
- .局部变量 ascii, 整数型
- ascii = 取代码 (字符, )
- .判断开始 (ascii ≥ 65 且 ascii ≤ 90) ' A-Z
- .判断 (ascii ≥ 97 且 ascii ≤ 122) ' a-z
- .判断 (ascii ≥ 48 且 ascii ≤ 57) ' 0=48,9=57
- .默认
- 返回 (假)
- .判断结束
- 返回 (真)
- .子程序 功能_逐字分割
- .参数 文本, 文本型
- .参数 wb数组, 文本型, 数组, 存放分割后的文本
- .局部变量 Buf, 文本型
- .局部变量 数据, 字节集
- 数据 = { 87, 139, 124, 36, 16, 51, 192, 51, 201, 56, 7, 116, 54, 86, 139, 116, 36, 24, 138, 20, 56, 128, 250, 127, 118, 9, 136, 20, 49, 131, 192, 1, 131, 193, 1, 138, 20, 56, 136, 20, 49, 131, 193, 1, 198, 4, 49, 32, 131, 192, 1, 131, 193, 1, 128, 60, 56, 0, 117, 214, 198, 4, 49, 0, 94, 95, 195, 139, 84, 36, 20, 136, 4, 17, 95 }
- Buf = 取空白文本 (取文本长度 (文本) × 2)
- CallWindowProcA (数据, _启动窗口.取窗口句柄 (), 1025, 文本, Buf)
- wb数组 = 分割文本 (Buf, “ ”, )
- .子程序 _编辑框_文本池_内容被改变
- 数组 = 分割文本 (编辑框_文本池.内容, #换行符, )
- .子程序 __启动窗口_创建完毕
- 数组 = 分割文本 (编辑框_文本池.内容, #换行符, )
复制代码- .版本 2
- .DLL命令 CallWindowProcA, 整数型, "user32.dll", "CallWindowProcA", , 转载自网上,用于逐字分割
- .参数 字节集, 字节集
- .参数 窗口句柄, 整数型
- .参数 消息类型, 整数型
- .参数 文本, 文本型
- .参数 buf, 文本型
复制代码- 中国
- 易语言
- 汉字
- 程序
- 数据类型
- 成员
- 程序集
- 子程序
- 参数
- 子程序参数
- 变量
- 程序集变量
- 全局变量
- 常量
- 资源
- 图片
- 声音
- 字节
- 短整数
- 整数
- 长整数
- 小数
- 双精度小数
- 数值
- 逻辑值
- 日期时间
- 文本
- 字节集
- 指针
- 子程序指针
- 系统
- 数据集
- 窗口
- 窗口组件
- 报表
- 报表组件
- 字体
- 文件
- 目录
- 属性
- 事件
- 尺寸
- 名称
- 坐标
- 宽度
- 高度
- 标签
- 标题
- 边框
- 颜色
- 音乐
- 图标
- 位置
- 帮助
- 信息
- 计数
- 计次
- 计算
- 计算机
- 电脑
- 数目
- 文件号
- 字段
- 数据库
- 索引
- fdajklfjakl
- fad
- fadf‘发【】43
- fadsf34
- 【】456
- 测试中文89345
- 测试345见了美女#¥%混合
- 我是用来测试用的文本没错我就是用来测试用的文本
- 我是用来测试用的文本没错我就是用来测试用的文
- 我是用来测试用的文本没错我就是用来测试用的
- 我是用来测试用的文本没错我就是用来测试用
- 我是用来测试用的文本没错我就是用来测试
- 我是用来测试用的文本没错我就是用来测
- 我是用来测试用的文本没错我就是用来
- 我是用来测试用的文本没错我就是用
- 我是用来测试用的文本没错我就是
- 我是用来测试用的文本没错我就
- 我是用来测试用的文本没错我
- 我是用来测试用的文本没错
- 我是用来测试用的文本没
- 我是用来测试用的文本
- 我是用来测试用的文
- 我是用来测试用的
- 我是用来测试用
- 我是用来测试
- 我是用来测
- 我是用来
- 我是用
- 我是
- 我
复制代码 上面这段文本是编辑框_文本池的。
==================混乱分割线
需要的朋友直接下载下面的附件吧。
混拼搜索.rar
(3.19 KB, 下载次数: 133)
代码其实就是把一堆文本和一个搜索文本,然后对比他们的经过处理之后的文本(转换成拼音加保留字母数字)是否存在短文本串中的字符完全顺序匹配长文本串(注:这里的短文本串指的是搜索文本处理之后的文本,然后比这个文本长度短的不会被判断是否匹配)
是否顺序匹配用的是判断之后的文本串是否匹配,然后砍掉之前的文本丢到递归里去。
再着就循环就是了。
然后...逐字分割是我随便找的
嗯...因为随手写了个混搜,所以来水一贴...准备睡觉,或者继续写软件。
|