例如:
我给了一个字符串,例如:“我现在要去学校,我现在要去学校”
要求正在改变 I -> We & am -> are 输出看起来像“我们现在要去学校,我们现在要去学校”
这意味着我必须将某些字符串模式替换为另一个。
在 Java 中实现这一目标的最佳方法是什么
例如:
我给了一个字符串,例如:“我现在要去学校,我现在要去学校”
要求正在改变 I -> We & am -> are 输出看起来像“我们现在要去学校,我们现在要去学校”
这意味着我必须将某些字符串模式替换为另一个。
在 Java 中实现这一目标的最佳方法是什么
处理字符串在内存效率方面总是很糟糕,因为您不能更改字符串,只能创建新字符串。最好的办法是接收一个 StringBuilder(如果您需要 ThreadSafe,则为 StringBuffer),然后使用一些算法来更改字符串或类似的东西: http ://www.java-examples.com/java-stringbuffer-replace-例子
但是,如果您自己收到一个字符串,我只会使用 replaceAll 方法来创建一个新字符串,因为无论如何您都需要这样做,即使使用字符串缓冲区:
http://www.roseindia.net/java/string-examples/string-replaceall.shtml
但是,如果您需要对字符串进行多次后续更改,则始终需要先转换为字符串缓冲区。
这取决于你想要做什么。
如果您只是想将所有出现的“I”替换为“We”,将“am”替换为“are”,那么String.replace
内存效率将比String.replaceAll
.
如果您想将“I”和“am”视为单词而不是字符序列,那么String.replace
将无法正常工作。相反,您需要使用String.replaceAll
使用单词边界匹配的模式来避免(例如)"I am going to school on a camel"
变成"We are going to school on a careel"
.
在这两种情况下,您应该能够通过手动使用 StringBuilder 和循环迭代原始字符串的字符并构建新字符串来获得更好的内存效率(即更少的垃圾生成)。
但是......这样的编码是痛苦的,而不是你应该考虑做的事情,除非你有令人信服的证据表明你需要这样做。过早的优化是个坏主意。在 99.9% 的情况下,如果你产生的垃圾比理论上需要的多一点,这并不重要。
这取决于您的应用程序。这可能和其他海报展示的一样简单,也可能很复杂并且是计算机科学的一部分。在后一种情况下,构建所谓的“trie”。这就像一棵树,但每个节点都有音节。
导航系统使用它来有效地存储一个国家所有街道的街道名称。