//List<String> 内容[ti:我本闺中一钗裙][oti:我本闺中一钗裙][jz:黄梅戏][jm:女驸马][ojm:女驸马][offset:-1][by:制作者][ver:驸马公主合唱][keys:民女,洞房][00:04.99](驸马):我本闺中一钗裙[00:31.93](公主白):此话当真[00:34.19](驸马):公主请看耳环痕[00:59.33]<结束>/** * 解析唱段内容 * * @param changDuan 唱段对象 * @param line 当前需要解析的内容 即上面 List<String> 每一行内容 * @param patternMap 唱段正则表达式 可以正则匹配上面 List<String> 内容 * @throws ParseLrcException */private static void parseLrcContent(ChangDuan changDuan, String line, Map<String, Pattern> patternMap) throws ParseLrcException { if (matcher(line, patternMap, LrcConstants.LrcRegEnum.TITLE.name())) { changDuan.setName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.TITLE.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.ORIGIN_TITLE.name())) { changDuan.setOriginName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.ORIGIN_TITLE.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.JUMU.name())) { changDuan.setJuMu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.JUMU.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.ORIGIN_JUMU.name())) { changDuan.setOriginJuMu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.ORIGIN_JUMU.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.OFFSET_REG.name())) { changDuan.setOffset(Integer.parseInt(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.OFFSET_REG.getStartIndex()))); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.JU_ZHONG.name())) { changDuan.setJuZhong(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.JU_ZHONG.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.BEIZHU.name())) { changDuan.setBeiZhu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.BEIZHU.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.VERSION.name())) { changDuan.setVersion(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.VERSION.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.KEYS.name())) { changDuan.setSearchKeys(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.KEYS.getStartIndex())); } else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.BY.name())) { changDuan.setMaker(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.BY.getStartIndex())); } else { throw new ParseLrcLineException(line); } }
上段代码是用于将List<String>解析成ChangDuan
想请教一下这个代码写的咋样,能否优化,我就是觉得if else太多了。
使用表驱动
设计模式即可
抽象一个接口:
interface IMatchParser{ boolean matcher(String line, Map<String, Patter> map); handle(ChangDuan changduan);}
每个if分支抽象成一个类继承IMatchParser
;
public class MatchParser1 implements IMatchParser{ public void handle(ChangDuan changduan) { changDuan.setName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.TITLE.getStartIndex())); } public boolean matcher(String line, Map<String, Patter> map) { return matcher(line, patternMap, LrcConstants.LrcRegEnum.TITLE.name()); }}
然后放到一个list中:
List<IMatchParser> list = new ArrayList();list.add(new MatchParser1());list.add(new MatchParser2());...
然后实现方法变成:
private static void parseLrcContent(ChangDuan changDuan, String line, Map<String, Pattern> patternMap) throws ParseLrcException { for (IMatchParser parser: list) { if (parser.match(line, patternMap)) { parser.handle(changDuan); break; } }}
后续加新的if分支只需要实现一个新的class插入到list即可
这段代码看起来是在处理歌词文件(LRC)的内容,对每一行歌词进行解析并填充到 ChangDuan 对象中。代码写得比较清晰,针对不同的歌词内容使用了不同的正则表达式进行匹配,然后提取相应的信息填充到 ChangDuan 对象中。
关于代码优化的问题,可以考虑以下几点:
matcher(line, patternMap, LrcConstants.LrcRegEnum.OFFSET_REG.name())
,你可以将这些公共代码提取出来,单独写一个方法进行复用。下面是一个简化的示例代码,使用了 switch-case 语句和 Map 来优化代码:
private static void parseLrcContent(ChangDuan changDuan, String line, Map<String, Pattern> patternMap) throws ParseLrcException { switch (line) { case LrcConstants.LrcRegEnum.TITLE.name(): changDuan.setName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.TITLE.getStartIndex())); break; case LrcConstants.LrcRegEnum.ORIGIN_TITLE.name(): changDuan.setOriginName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.ORIGIN_TITLE.getStartIndex())); break; // ... 其他属性类似处理 default: throw new ParseLrcLineException(line); }}
此外,你还可以考虑使用一些开源的歌词解析库,例如 Jieba 的歌词解析库,这些库通常已经实现了歌词的解析和分词功能,可以减少自己编写的代码量。
有没有代码写的漂亮的大佬,看看这个代码怎么优化,一直写前端的,突然被叫去搞java,发现很多技术都不太相同,例如动态的key去调用之类,导致写出这样的恶心代码,自己都看不下去了 明明js可以写的这么短小优雅,java有没有办法做到这样子的呢
如果我有模式: 和一个解析器: 和两个可能的查询。问题#1: 和查询#2: 是否可以优化冲突解决程序,使查询#1 readAllPosts仅从数据库中提取标题,而查询#2则同时提取标题和lotsofdata? 我查看了parent、args、context和info参数,但看不到任何指示解析器是否被调用以响应像#1或#2这样的查询的内容。
我必须对VTD-XML库进行性能测试,以便不仅进行简单的解析,而且在解析中进行额外的转换。所以我有30MB的输入XML,然后用自定义逻辑将其转换为其他XML。因此,我想消除所有的想法,这减缓了整个过程,从我这边来(因为没有很好地使用VTD库)。我试图搜索优化提示,但找不到。我认为: '0'. 选择selectXPath或selectElement最好使用什么? > 使用不带名称空间的解析要快得多。
因为 a.pinyin[0] 的原因,我不知道怎么用 a[..] 的方式简化代码 谢谢
不清楚这样的问题该怎么起标题…… 这是一个简单的格式化长度的方法,以米为基础单位,这是我自己写的,请问有更简洁的写法吗?谢谢
首先,根据句子的大小,解析在小的句子集上平稳运行--从200ms到1s的顺序。 我想实现什么? 我想在1-2小时内解析50L个句子。 不知怎么的,我需要把这个转换成-> 转换为多线程调用。我编写了一个多线程执行器来做这件事,它看起来像这样-> 有什么办法可以做到吗?我能回答先前提出的问题,但没有什么好处。