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

想要实现的

最近做的一个五笔码表工具,想要实现根据用户输入的词条自动生成输入编码。
比如:
输入 ​​​我们​​​ 生成 ​​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

最终的结果是这样:

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

实际应用效果

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