题
我正在编写一个疯狂的库程序,只是为了好玩,只是为了编写一些东西。该程序本身非常简单,但由于游戏的性质(将用户给定的单词放入句子中),我发现自己诉诸于多种串联。是否有一种优雅的解决方法可以减少串联,甚至消除它们以获得更高效的结果?我知道最终是否使用串联并没有什么区别,但我很好奇是否有更优雅的方式来编写这个程序。
更新:我正在使用java,但如果有一个通用的解决方案来转义连接,那也将不胜感激。
解决方案
一个解决方案可能是写出来你的整个填字文件,并把在需要由被选择这样的词语来代替特殊标记。
您刚买了一台崭新的$ {}名1, 并且它要$ {} VERB1你。
然后,可以使用例如:String.replace("${NOUN1}", noun1)
对于所有的字
其他提示
这是您使用的语言?
最高级语言将有类似的东西:
String.Format("{0} {1} {2} {3}", word1, word2, word3, word4);
我可以通过两种方式让您完全避免游戏中的串联:
将故事模板存储为标记集合:不可变部分和单词占位符。然后循环遍历集合,输出不可变部分和用户单词而不是单词占位符。
编写自定义打印类,该类将使用 charAt 循环遍历模板字符串并输出单词而不是单词占位符。
不需要调用用于与string.replace每个单词或不断附加到一个StringBuilder,你可以把词语的有序阵列和在JDK 1.4使用的String.format(在JDK 1.5或更高版本)或MessageFormat.format。不幸的是,图案格式两者是不同的。
String myPattern = "My %s eats your %s"; // get values from the user here String result = String.format( myPattern, (Object[])myArray );
或
String myPattern = "My {0} eats your {1}"; // get values from the user here String result = MessageFormat.format( myPattern, (Object[])myArray );
下面是一个完整的程序,在字符串中与来自命令行的值填补。
public class Format { public static void main( String[] args ) { String pattern = "My %s eats your %s"; System.out.println( String.format( pattern, (Object[])args )); } }
有是你的问题的两个方面。
首先,你可能希望避免直接在代码中使用串连。然后你可以使用一些字符串格式化程序从运行。这不会跳过串连,但将他们从你的代码运行时移动。
其次,你可能需要更多efficently做级联。这是另一个故事。这里最重要的是预分配足够大的缓冲区串联的字符串,因为内存重新分配是相当昂贵的。复制子到结果字符串通常是较便宜的,并且是必要的恶
没有在我脑海中,以避免拼接的一般方式而言。你可以做的是自己写某种辅助类的简化了串联的工作适合你。 不过,我想给你一个建议是不要直接连接字符串为
String x = "Hi";
String y = x + " there!";
字符串连接的实现是Java比较慢,所以这是一个更好的做法是用StringBuffer来代替,特别是如果你做了很多级联的:
StringBuffer myStringBuffer = new StringBuffer();
myStringBuffer.append("Hi");
myStringBuffer.append(" there!");
这样的事情。我没有一个编译器现在检查这一点,但我敢肯定,你自己看着办吧自己。
不确定爪哇但在某些其他语言如PHP和Javascript创建阵列和连接的所有元素可以更快。
JavaScript示例:
var str = str1 + str2 + str3 + "str4" + str5 + "str6" + str7;
var str = [str1, str2, str3, "str4", str5, "str6", str7].join("");
PHP示例:
$str = $str1 . $str2 . $str3 . "str4" . $str5 . "str6" . $str7;
$str = implode("", array($str1, $str2, $str3, "str4", $str5, "str6", $str7));
此方法是最好的,如果你想要把每个串之间的分隔符在这种情况下,不仅是速度快,但更紧凑和可读性。
这是“避免串联”我假设你的意思分配新的字符串的空间和分配的呢?如果你在.NET则 StringBuilder的应该帮助一些我的想法。
如果你有一个字符串的需要修改它,很多时候,使用一个char []数组,并做修改它可能做的伎俩,当创建一个字符串。
这当然是可能的,如果你想做到这一点无连接。虽然它可能不是很值得的。
这部分取决于你要显示的结果,其中。如果是在网上或在控制台上,那么你可以直接把结果写入输出流。
因此,举例来说,如果你的模板是什么“的001%跳出的002%”你可以:
1)扫描所述字符串以找到其中变量。 2)打破串入的组件列表“中”,“跳出了的”,在这种情况下, 3)通过您的列表的元素,结果环,并将其倾倒到输出与是这样的:
PrintStream = //get output from somewhere
for(int i = 0; i < pieces.size()-1 ; i++){
ps.print(peices.get(i));
ps.print(answers.get(i));
}
ps.print(pieces.get(pieces.size()-1));//last one
现在。我不知道你会说这就是“优雅”与否。这很可能是一种快。就像我说的,也许是合适的,如果这是一个Web服务,它成为了超人气,等等。
如果这是一个GUI应用程序,您可以编写代码来单独绘制的字符串,但可能会需要更多的时间,然后串联。
但的一件事,你能做的是使用一个ByteArrayOutputStream和预分配足够的空间,以便它可以包含填写马德利布未做额外拨款。这将是相当快为好。
为什么你要避免级联如果清洁度尝试衬起来很好,它可能最终看起来出奇good.Even如果你担心,你可能不需要使用字符串生成器的表现,我相信,如果你这样做一串级联的简单(即“fdsfsd” + VAR1 + VAR2 +“dsfsdf” +“tyhty”它编译成同样的事情字符串生成器(实际上是相同的,看起来更清洁)。字符串构建有一定道理,如果你concating一个在一个循环或具有复杂的流动吨的东西。