算法:五笔编码,如何根据输入的词条自动生成输入编码

算法:五笔编码,如何根据输入的词条自动生成输入编码

一、想要实现的

最近做的一个五笔码表工具,想要实现根据用户输入的词条自动生成输入编码。
比如:
输入 我们 生成 trwu
输入 五笔基础知识 生成 gtay

二、五笔基础知识

五笔的所有输入编码都最多只有4个字母,规则是这样的:

  1. 一个字时,字的前三个编码对应字母,和最后一个编码应用字母
  2. 两个字时,取这两个字的前两个字根字母
  3. 三个字时,取前两个字的第一个字根,第三个字的前两个字根
  4. 四个或更多字时,取前三个字的第一个字根,最后一个字的第一个字根

我要处理的五笔码表是这样的:
前面是词条,后面是词条对应的输入码

工兵	aarg
戒掉	aarh
芭蕾舞	aarl
熙熙攘攘	aarr
芽接	aaru
戒指	aarx
工模	aasa
工棚	aase
工本	aasg
花草树木	aass
式样	aasu
荛	aat

三、如何实现

1. 获取字典

先从基础码表中筛选出一套单字字典来,满足以下几个条件:

  • 单字
  • 编码在2个以上(因为2字以上的词条,只需要前两个编码就能凑够五笔的4码)

我是这样实现的:

 let characterMap = new Map() // 新建一个字典
 this.dictMain.wordsOrigin.forEach(item => {
     if (item.word.length === 1
         && item.code.length >= 2
         && !characterMap.has(item.word)) // map里不存在这个字
     { // 编码长度为 4 的单字        
         characterMap.set(item.word, item.code)
     }
 })

2. 获取每个字的编码数组

 let decodeArray = [] // 每个字解码后的数组表
 word.split('').forEach(ch => {
 	// 查询每个字的编码,并放到数组中
     decodeArray.push(this.dictMain.characterMap.get(ch))
 })

我们的日子 得出的数组是这样

["trn", "wu", "rqy", "jjjj", "bb"]

在这里插入图片描述

3. 拼成输入码

获取到了输入编码的数组,如果字数大于4,只截取4个,前三个字的编码和最后一个字的编码。
只需要根据规则将它拼起来就好了。

let decodeArray = [] // 每个字解码后的数组表
let letterArray = word.split('')
if (letterArray.length > 4){ // 只截取前三和后一
    letterArray.splice(3,letterArray.length - 4)
}
letterArray.forEach(ch => {
    decodeArray.push(this.dictMain.characterMap.get(ch) || '')
})
let phraseCode = ''
 switch (decodeArray.length){
     case 0:
     case 1:
         break
     case 2: // 取一的前二码,二的前二码
         phraseCode =
             decodeArray[0].substring(0,2) +
             decodeArray[1].substring(0,2)
         break
     case 3: // 取一二前一码,三前二码
         phraseCode =
             decodeArray[0].substring(0,1) +
             decodeArray[1].substring(0,1) +
             decodeArray[2].substring(0,2)
         break
     default: // 取一二三前一码,最后的一码
         phraseCode =
             decodeArray[0].substring(0,1) +
             decodeArray[1].substring(0,1) +
             decodeArray[2].substring(0,1) +
             decodeArray[decodeArray.length - 1].substring(0,1)
 }
 console.log(phraseCode, decodeArray)
 return phraseCode

最终的结果是这样:

请添加图片描述

四、实际应用效果

请添加图片描述

根据输入的汉子 自动生成五笔代码和拼音代码(简码:取每个汉子的拼音的首字母或者每个汉子的五笔的首字母)本人写了两个存储过程 其实几乎差不多 但是往往啊 会因为一点点小问题导致代码失败 不过 下面的两个存储过程都是成功的 我是因为那么一点点小问题测试了一个上午才搞定了的:对应存储过程 output的参数 一定要先set@=‘’一下才能使用 否则即便是output被赋值了 可以print,但是通过程序代码还是获取不到值的 如下:(具体的在附件里哦,附件里有表数据和存储过程和c#程序代码片段):--drop procedure ChineseCode; ----------一 create procedure ChineseCode(@strkey varchar(30),@rekeysPY varchar(30) output, @rekeysWB varchar(30) output) as declare @keylength int declare @nowstep int declare @temppy varchar(20) declare @tempwb varchar(20) declare @tempkey varchar(4) declare @strpy varchar(30) declare @strwb varchar(30) set @keylength=len(@strkey) set @nowstep=1 set @strpy='' set @strwb='' 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 end set @rekeysPY=@strpy set @rekeysWB=@strwb print @rekeysPY+'--'+@rekeysWB end GO --------------------二 --drop procedure ChineseCode; create procedure ChineseCode ( @strkey varchar(30) , @rekeysPY varchar(30) output, @rekeysWB varchar(30) output) as declare @keylength int declare @i int declare @temppy varchar(10) declare @tempwb varchar(10) declare @tempkey varchar(2) set @keylength=len(@strkey) set @i=1 set @temppy='' set @tempwb='' set @rekeysPY='' set @rekeysWB='' begin while (@i<=@keylength) 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 print @rekeysPY+'--'+@rekeysWB end GO ----------------三 c#代码 PubClass.ContSql db = new MilkDisPatchingManage.PubClass.ContSql(); SqlCommand sqlcmd = new SqlCommand(); sqlcmd.CommandType = CommandType.StoredProcedure; sqlcmd.CommandText = "ChineseCode"; sqlcmd.Parameters.Add("@strkey", SqlDbType.VarChar, 30); sqlcmd.Parameters["@strkey"].Value=this.textBox1.Text.Trim();//.Direction=ParameterDirection.Input; sqlcmd.Parameters.Add("@rekeysPY", SqlDbType.VarChar,30); sqlcmd.Parameters["@rekeysPY"].Direction = ParameterDirection.Output; sqlcmd.Parameters.Add("@rekeysWB", SqlDbType.VarChar,30); sqlcmd.Parameters["@rekeysWB"].Direction = ParameterDirection.Output; int i= db.ExtCom(sqlcmd); this.textBox2.Text = sqlcmd.Parameters["@rekeysPY"].Value.ToString(); this.textBox3.Text = sqlcmd.Parameters["@rekeysWB"].Value.ToString(); db.CloseCon();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月ooOO

许个愿,我帮你实现

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值