字符拼接方法及装置与流程

文档序号:12123262阅读:225来源:国知局
字符拼接方法及装置与流程

本发明涉及软件开发技术领域,特别涉及一种字符拼接方法及装置。



背景技术:

在计算设备中,内存资源是软件/应用运行时需占用和争夺的最主要资源之一,合理有效的内存分配和管理是提高软件/应用运行速度和增强系统稳定性的关键手段。在软件编程领域内存的规划和管理尤为重要,因程序在调试和编译过程中会不停创建和使用各类数据,无论什么样的数据结构都需要占用一定的内存空间,若不能有效管理内存,势必会严重影响系统效率和稳定性。

现有技术中,无论使用哪种开发语言、开发工具或开发哪类软件,无一例外地,软件编程过程中对于字符串(String)的处理最为频繁,因为:第一,真实世界的大部分事物大都能通过字符串来描述;第二,字符串的文字内容是计算机信息与人类交互最直白的形式之一;第三,字符串也是程序、计算机之间通信方式。基于上述三点,软件编程过程中总会面对大量的字符串拼接操作,而无论采用哪种数据结构来实现(最常见的以数组实现),每一个字符串创建和拼接都会占用一定的内存空间,当存在大量且频繁地创建和拼接字符串行为时,会对计算设备的内存资源造成严重的占用,除造成内存空间紧张外,更会对系统整体的运行效率和稳定性带来严重影响。

现有技术中,最常见的字符串拼接方式为使用“+”操作符,该方式每次操作都会新建不同的String对象,这不仅效率低下且造成了内存资源的极大浪费。而较新出现的字符缓存(StringBuffer)和字符关联结构(StringBuilder)方式虽然使用缓存来避免过于频繁地生成新对象,适当提升了性能并减少了内存空间的浪费,但现有技术要么缓存管理不太灵活,要 么过多考虑了其他不常用功能,在单纯的字符串存储和拼接方面的效率和性能仍不太理想。



技术实现要素:

基于现有技术的缺陷,本发明所要解决的技术问题是如何最高效地实现字符串拼接。

根据本发明的一个方面,提供了一种字符拼接方法,包括:

根据获取的待拼接字符串的长度,确定所述待拼接字符串的拼接空间;

获得所述拼接空间中的至少一个字符串的长度和/或存储位置;

根据所述拼接空间中的至少一个字符串的长度和/或存储位置,确定所述待拼接字符串在所述拼接空间中的拼接位置;

在所述拼接位置上,将所述待拼接字符串与所述拼接空间中的字符串进行拼接。

优选地,所述确定所述待拼接字符串的拼接空间包括:

根据所述待拼接字符串的长度,确定当前拼接空间是否需要扩容,若需要扩容,则将扩容的缓存块添加在当前所述拼接空间的最后位置。

优选地,所述确定所述待拼接字符串的拼接空间包括:

根据所述待拼接字符串的长度判断当前拼接空间剩余容量是否足够,若剩余容量足够则结束;

在剩余容量不足时,计算所述当前拼接空间的大小;

根据所述当前拼接空间的大小,创建新的拼接空间;

将所述当前拼接空间的数据全部填充到所述新的拼接空间中;

将所述新的拼接空间设置为当前拼接空间。

优选地,所述获得所述拼接空间中的至少一个字符串的长度和/或存储位置包括:在出现冗余时,覆盖所述冗余的长度和/或剔除所述冗余占用的空间位置。

优选地,在所述输入字符串的长度不大于预设长度时,直接将所述待拼 接字符串逐一拼接在所述拼接位置上;在所述输入字符串的长度大于预设长度时,将所述待拼接字符串整串拷贝拼接在所述拼接位置上。

根据本发明的另一个方面,还提供了一种字符拼接装置,包括:

空间管理模块,用于根据获取的待拼接字符串的长度,确定所述待拼接字符串的拼接空间;

位置获取模块,用于获得所述拼接空间中的至少一个字符串的长度和/或存储位置;以及,

位置确定模块,用于根据所述拼接空间中的至少一个字符串的长度和/或存储位置,确定所述待拼接字符串在所述拼接空间中的拼接位置;

拼接模块,用于在所述拼接位置上,将所述待拼接字符串与所述拼接空间中的字符串进行拼接。

优选地,所述空间管理模块包括:

直接扩容模块,用于根据所述待拼接字符串的长度,确定当前拼接空间是否需要扩容,若需要扩容,则将扩容的缓存块添加在所述当前拼接空间的最后位置。

优选地,所述空间管理模块包括:

容量判断模块,用于根据所述待拼接字符串的长度判断当前拼接空间剩余容量是否足够,若剩余容量足够则结束;

空间大小计算模块,用于在剩余容量不足时,计算所述当前拼接空间的大小;

空间创建模块,用于根据所述当前拼接空间的大小创建新的拼接空间;

数据填充模块,用于将所述当前拼接空间的数据全部填充到所述新的拼接空间中;

设置模块,用于将所述新的拼接空间设置为当前拼接空间。

优选地,所述位置确定模块包括:

冗余处理模块,用于在出现冗余时,覆盖所述冗余的长度和/或剔除所述冗余占用的空间位置。

优选地,所述拼接模块包括:

逐一拼接模块,用于在所述输入字符串的长度不大于预设长度时,直接将所述待拼接字符串逐一拼接在所述拼接位置上;和/或,

整串拼接模块,用于在所述输入字符串的长度大于预设长度时,将所述待拼接字符串整串拷贝拼接在所述拼接位置上。

本发明实施例提供了一种字符拼接方法及装置,利用简单高效的缓存区管理,无需频繁创建字符串对象,避免了内存空间的浪费;同时其单纯关注于字符串拼接操作,以最高效率完成了操作频度最高的数据处理,实现了性能最佳的字符串拼接方案。

附图说明

图1是本发明实施例中字符拼接方法的基本流程示意图;

图2是本发明优选实施例中缓存区扩容方法流程示意图;

图3是本发明实施例中字符拼接装置的模块结构示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。

在实际的软件编程过程中,字符串拼接是使用频率最高、处理量最大的数据处理类型。但现有技术的字符串处理方案中,“+”操作符方式处理效率低下且内存浪费严重,字符缓存(可用StringBuffer表示)和字符关联结构(可用StringBuilder表示)方式则过多考虑了不常用功能,比如写入、删除、替换等方法,造成了整体性能的下降。在本发明实施例中,利用简单高效的缓存区管理,实现了性能最佳的字符串拼接方案。如图1所示,本发明实施例的字符拼接方法包括:

S1,根据获取的待拼接字符串的长度,确定所述待拼接字符串的拼接空间;

S2,获得所述拼接空间中的至少一个字符串的长度和/或存储位置;

S3,根据所述拼接空间中的至少一个字符串的长度和/或存储位置,确定所述待拼接字符串在所述拼接空间中的拼接位置;

S4,在所述拼接位置上,将所述待拼接字符串与所述拼接空间中的字符串进行拼接。

其中,步骤S1中,若待拼接字符串为空或不为字符串形式,则直接结束该方法。

步骤S2中,根据待拼接字符串的长度,确定当前拼接空间是否需要扩容,若需要扩容,则将扩容的缓存块添加在当前拼接空间的最后位置。

优选地,本发明实施例采用翻倍拼接空间方式进行扩容,即扩容后当前拼接空间大小为扩容前的2倍。当然为避免造成过多浪费,每次扩容的缓存块大小也有上限,该上限阈值可采用预设的默认阈值,也可临时设置和/或调整,默认阈值通常为10字(单位W,字长取决于计算设备的实际处理能力);比如在当前缓冲区大于5W时,最多一次也只能扩容10W的容量。

在本发明更优选的实施例中,采用创建全新拼接空间的方式来实现扩容,如图2所示,拼接空间扩容控制方法包括:

S11,根据字符串的长度判断当前拼接空间剩余容量是否足够,若剩余容量足够则结束;

S12,在剩余容量不足时,计算当前拼接空间的大小;

S13,根据当前拼接空间的大小创建新的拼接空间;

S14,将当前拼接空间的数据全部填充到新的拼接空间中;

S15,将新的拼接空间设置为当前拼接空间。

因内存分配具有随机性,当前拼接空间之后的空间是否已被分配很难保证,若强制将当前拼接空间之后的空间作为扩容的缓存块分配给当前拼接空间,很容易引发内存资源冲突,故该优选实施例虽然会浪费部分资源却能保 证数据安全和系统的稳定性,扩容前的拼接空间在适当的时机进行内存回收即可。

步骤S4中,字符串的拼接可采用两种方式实现:直接按字符逐一拼接附加或将字符串从此指定位置复制到Unicode字符数组中的指定位置,即调用String.CopyTo方法整字符串拼接附加。

根据实际的性能测试,在字符串的长度不大于3时,采用直接赋值的逐一拼接方式性能更高;而长度大于3时,调用String.CopyTo方法性能更高。

在本发明优选实施例中,使用一个字符数组Char[]作为拼接空间的缓存区(Buff),使用一个位置属性Position来指示当前拼接空间的字符串末尾位置,该位置属性Position还同时可用于表示当前拼接空间中已有字符数。

步骤S4中,输入的字符串按照位置属性(可用Position表示)的指示拼接附加到当前拼接空间的字符串末尾。在拼接字符串后,相应的位置属性Position也会对应修改后指示拼接后的字符串末尾。

在本发明另一个优选实施例中,位置属性Position指示的拼接位置还可以是拼接空间的任意位置,比如在拼接空间中指定的字符串后进行拼接,此时根据该指定的字符串长度和/或存储位置,确定待拼接字符串的拼接位置。当出现冗余时,长度和位置计算可以是剔除所占空间位置、覆盖空间内字符所占空间的长度。更进一步地,拼接位置还可以是首部拼接,即将待拼接字符串插入到首部,此时将待拼接字符串的末尾与拼接空间中字符串首部拼接,位置属性Position指示的拼接位置为0。

步骤S4中,拼接了输入字符串后的当前拼接空间数据实际已实现了字符串拼接,此时采用字符串重写方法将拼接后字符串输出。

在本发明优选实施例中,用文本方式存储字符串,即调用ToString方法,将当前缓冲区的字符数组中从0到输出位置的内容转为String对象输出。

下面给出一个具体的应用实例来说明本发明实施例的方法:

假设用户分别输入“ABCD”和“12345”两个字符串;首先可以确定出“ABCD”的长度为4,“12345”的长度为5。随后检查当前拼接空间剩余容量是否足够; 假设当前拼接空间的剩余容量只可以存储长度为3的字符串,根据确定出“ABCD”的长度为4、“12345”的长度为5,可以肯定当前拼接空间需要扩容。按相应的方式扩容后,将“ABCD”和“12345”分别拼接附加到当前拼接空间的末尾;最后,将当前拼接空间内容输入,得到拼接后字符串“ABCD12345”(假设输入前当前拼接空间为空)。

更具体地,本发明的方法优选包装为一个自定义的快速字符创建类(类名如QuickStringBuilder),编程使用时先构建一个QuickStringBuilder对象,拼接操作为字符串添加(Append())方法,比如调用Append(“abc”),接着又Append(“def”),此时拼接空间已得到拼接内容,最后调用ToString(),则将拼接后结果“abcdef”返回给用户。

进一步如图3所示,本发明实施例还提供了一种字符拼接装置1,包括:

空间管理模块101,用于根据获取的待拼接字符串的长度,确定所述待拼接字符串的拼接空间;

位置获取模块102,用于获得所述拼接空间中的至少一个字符串的长度和/或存储位置;以及,

位置确定模块103,用于根据所述拼接空间中的至少一个字符串的长度和/或存储位置,确定所述待拼接字符串在所述拼接空间中的拼接位置;

拼接模块104,用于在所述拼接位置上,将所述待拼接字符串与所述拼接空间中的字符串进行拼接。

在本发明优选实施例中,可采用添加缓存块的直接扩容方式管理拼接空间,优选地,所述空间管理模块101包括:

直接扩容模块,用于根据所述待拼接字符串的长度,确定当前拼接空间是否需要扩容,若需要扩容,则将扩容的缓存块添加在所述当前拼接空间的最后位置。

在本发明另一优选实施例中,还可采用创建新空间的方式管理拼接空间,优选地,所述空间管理模块101包括:

容量判断模块,用于根据所述待拼接字符串的长度判断当前拼接空间剩 余容量是否足够,若剩余容量足够则结束;

空间大小计算模块,用于在剩余容量不足时,计算所述当前拼接空间的大小;

空间创建模块,用于根据所述当前拼接空间的大小创建新的拼接空间;

数据填充模块,用于将所述当前拼接空间的数据全部填充到所述新的拼接空间中;

设置模块,用于将所述新的拼接空间设置为当前拼接空间。

此外,本发明优选实施例还针对字符串冗余情况进行处理,所述位置确定模块102包括:

冗余处理模块,用于在出现冗余时,覆盖所述冗余的长度和/或剔除所述冗余占用的空间位置。

字符串拼接可针对不同情况逐字拼接或整串拼接,优选地,所述拼接模块104包括:

逐一拼接模块,用于在所述输入字符串的长度不大于预设长度时,直接将所述待拼接字符串逐一拼接在所述拼接位置上;和/或,

整串拼接模块,用于在所述输入字符串的长度大于预设长度时,将所述待拼接字符串整串拷贝拼接在所述拼接位置上。

本领域相关技术人员可以理解,与上述方法一一对应地,本发明实施例的装置中也同时存在与各方法步骤相对应的各功能模块,在此不再一一赘述。在实际应用中,上述字符拼接装置可以是独立的计算设备,也可以是由计算设备加载的独立功能单元,还可以是计算设备直接实现的虚拟/实体单元。同样,装置中的各模块均可由位于计算设备中的中央处理器CPU、微处理器MPU、数字信号处理器DSP或现场可编程门阵列FPGA等实现,本发明实施例的装置及其模块的实现手段不应视为对本发明具体实施方式的限制。

本发明实施例提供了一种字符拼接方法及装置,其可以实现任意位置的拼接,在拼接空间中确定出可以进行拼接的位置,这个拼接位置可以是字符串末尾,也可以是根据不同需求或应用场景插入在中间、首部等;本发明实 施例利用简单高效的缓存区管理,无需频繁创建字符串对象,避免了内存空间的浪费;同时其单纯关注于字符串拼接操作,以最高效率完成了操作频度最高的数据处理,实现了性能最佳的字符串拼接方案。在实际应用中,本发明实施例的QuickStringBuilder类仅仅用来代替简单的字符串“+=”这样的操作,故只需要实现Append()方法,其性能优于StringBuilder类,根据实际性能测试,在计算设备配置相对较差的情况下,本发明实施例的性能优势更为明显。

应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1