我正在编写一个疯狂的库程序,只是为了好玩,只是为了编写一些东西。该程序本身非常简单,但由于游戏的性质(将用户给定的单词放入句子中),我发现自己诉诸于多种串联。是否有一种优雅的解决方法可以减少串联,甚至消除它们以获得更高效的结果?我知道最终是否使用串联并没有什么区别,但我很好奇是否有更优雅的方式来编写这个程序。

更新:我正在使用java,但如果有一个通用的解决方案来转义连接,那也将不胜感激。

有帮助吗?

解决方案

一个解决方案可能是写出来你的整个填字文件,并把在需要由被选择这样的词语来代替特殊标记。

  

您刚买了一台崭新的$ {}名1,   并且它要$ {} VERB1你。

然后,可以使用例如:String.replace("${NOUN1}", noun1)对于所有的字

其他提示

这是您使用的语言?

最高级语言将有类似的东西:

String.Format("{0} {1} {2} {3}", word1, word2, word3, word4);

我可以通过两种方式让您完全避免游戏中的串联:

  1. 将故事模板存储为标记集合:不可变部分和单词占位符。然后循环遍历集合,输出不可变部分和用户单词而不是单词占位符。

  2. 编写自定义打印类,该类将使用 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一个在一个循环或具有复杂的流动吨的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top