Java 有记忆意识的字符串过滤

Java 有记忆意识的字符串过滤,java,string,filter,replace,Java,String,Filter,Replace,假设我有500字: Martin Hopa Dunam Golap Hugnog Foo ... + 494 more words 我有以下总共约85KB的文本: 马汀去给他买了自己的东西 从霍帕商店,现在他正在寻找 用他最好的方法把它储存起来 朋友杜南。他们正在计划 使用他们在里面找到的Golap锁 福镇的雨果店>。。。文本继续分成几页 我想提出以下案文: ----去给他自己买东西 从---商店,现在他正在寻找 用他最好的方法把它储存起来 朋友--。他们正在计划 使用他们在中找到的-锁 --

假设我有500字:

Martin
Hopa
Dunam
Golap
Hugnog
Foo
... + 494 more words
我有以下总共约85KB的文本:

马汀去给他买了自己的东西 从霍帕商店,现在他正在寻找 用他最好的方法把它储存起来 朋友杜南。他们正在计划 使用他们在里面找到的Golap锁 福镇的雨果店<代码>>。。。文本继续分成几页

我想提出以下案文:

----去给他自己买东西 从---商店,现在他正在寻找 用他最好的方法把它储存起来 朋友--。他们正在计划 使用他们在中找到的-----镇上购物<代码>>。。。文本继续分成几页

目前我正在使用commons方法:

String[] 500words = //all 500 words
String[] maskFor500words = // generated mask for each word
String filteredText = StringUtils.replaceEach(textToBeFiltered, 500words , maskFor500words);
  • 在内存和CPU使用方面,有没有其他更有效的方法
  • 500字的最佳存储空间是什么?文件、列表、枚举、数组
  • 你将如何获得统计数据,例如替换了多少个单词和哪些单词;每个单词被替换了多少次
    我不会太在意CPU和内存的使用。对于这样一个问题和如此大量的文本,它应该相对较小。 我要做的是

    • 有一个包含所有字符串作为键的映射,其中包含在文本中找到字符串的次数(最初为0)
    • 使用StringTokenizer或String.split()方法逐字读取文本
    • 对于每个单词,查找映射是否包含它(O(1)操作,非常快速)
    • 如果包含它,则向StringBuilder添加“----”,并增加为映射中的单词存储的值
    • else添加单词本身(前面有空格,除非它是文本的第一个单词)
    A流程结束时,StringBuilder包含结果,映射包含每个单词用作替换的次数。 确保使用原始文本的长度初始化STringBuilder,以避免过多的重新分配


    应该简单高效。

    如果我正确理解了问题,您需要读取85KB的文本并解析出每个单词(使用split或StringTokenizer)。对于每个单词,您需要知道它是否在500个单词的集合中,如果是,请使用相应的掩码进行切换

    如果您知道您有大约500个单词,我建议将这500个单词及其掩码存储在一个HashMap中,初始容量约为650(JDK doc说,负载系数为0.75时,哈希最有效)。使用for循环将单词掩码对放入HashMap中

    对buck(HashMap)来说,最大的好处是get/put操作(搜索键)是在固定时间内完成的,这比数组中的O(n)要好,如果对排序数组进行二进制搜索,甚至比O(log(n))要好

    有了HashMap,您可以在过滤85KB文本的同时构建一个SringBuffer。 从方法中返回字符串.toString(),就完成了!你好,-M.S


    PS如果您在服务器上构建映射并在其他地方(在客户机上)进行过滤,并且需要传输字典,HashMap将不起作用-它无法序列化。在这种情况下使用哈希表。如果在同一台机器上,HashMap的内存效率更高。稍后,-M.S.

    我不会太在意记忆,但如果你在意的话:是你的朋友。对于大型集合,它的内存效率很高,并且允许非常高效的匹配。您可能希望在一个内存分析器中实现它。

    您可以使用内存分析器来查看您正在使用的内存量。您可能期望500个字使用64 KB的内存。除非您使用手机运行此操作,否则不必担心。如果您希望代码可配置,也就是说,如果500个字可能会更改,请使用一个文件,但将其读入其他结构。我会将单词读入一个数组(或者数组列表,因为您可能并不总是能够预测其中的数量)。如果您担心的话,阵列将提供最快的读取访问,占用最少的内存。