Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以下哪种解决方案具有更好的风格/性能?_Java_Optimization - Fatal编程技术网

Java 以下哪种解决方案具有更好的风格/性能?

Java 以下哪种解决方案具有更好的风格/性能?,java,optimization,Java,Optimization,我发现了一个关于codingBat的有趣练习,现在我有一个关于解决方案的问题。任务是: 给定一个字符串,如果字符串中的x的第一个实例紧接着另一个x,则返回true 我写的是: boolean doubleX(String str) { return str.contains("x") ? str.indexOf('x') == str.length() - 1 ? false : str.charAt(str.indexOf('x')) == str.charAt(str.index

我发现了一个关于codingBat的有趣练习,现在我有一个关于解决方案的问题。任务是:

给定一个字符串,如果字符串中的
x
的第一个实例紧接着另一个
x
,则返回
true

我写的是:

boolean doubleX(String str) {
      return str.contains("x") ? str.indexOf('x') == str.length() - 1 ? false : str.charAt(str.indexOf('x')) == str.charAt(str.indexOf('x') + 1) : false;
}
他们页面上的解决方案是:

boolean doubleX(String str) {
   int i = str.indexOf("x");
   if (i == -1) return false; // no "x" at all

   // Is char at i+1 also an "x"?
   if (i+1 >= str.length()) return false; // check i+1 in bounds?
      return str.substring(i+1, i+2).equals("x");
所以现在我的问题是哪种解决方案具有更好的编码风格?哪种解决方案更漂亮或更有效


感谢您的所有回答

我可能会这样编码:

boolean doubleX(String str) 
{
    int index = str.indexOf("x");
    return (index >= 0 && index == str.indexOf("xx", index));
}
可能不是最有效的,但它处理了所有的可能性

如果
indexOf(“x”)
indexOf(“xx”)
相距很远(不需要长时间搜索
“xx”
),或者如果两个索引都很高(长时间搜索两次),则搜索速度可能会很慢

因此,另一个稍不直观但性能更高的解决方案可能是:

boolean doubleX(String str)
{
    int index = str.indexOf("x");
    return (index >= 0 && index < str.length() - 1 && str.charAt(index + 1) == 'x');
}
boolean doubleX(字符串str)
{
int index=str.indexOf(“x”);
返回(索引>=0&&index
想象一下,您是另一位前来阅读您的解决方案的程序员。每件事都在一条线上争论不休,需要一些额外的时间来消化每一种情况以及它们如何实际协同工作。如果编译器是一个好的编译器,性能实际上不会有太大差别,因为它实际上会检测变量并以不同的方式对可执行文件进行编码1)更好的编码风格:codingBat解决方案。因为很容易理解。2) 漂亮的:codingBat解决方案。好的、清晰的、高效的:这要看情况了。str.indexOf(“xx”)怎么样?这更具可读性,使用标准库代码,因此性能更好。@BoristheSpider:哦,好吧,我明白你的意思了:)它只用于首次出现x。对不起,我误解了。是的,对不起@BoristheSpider和onCC,我的错误,没有正确阅读问题:(注意
charAt
O(1)
-这只是一个数组访问。@Boris:
charAt()
可能是O(1),但可能仍然很慢。无论如何,使用
charAt()
您必须首先检查您是否超出字符串的末尾,等等。我想我的孤子不是性能最好的,只是相当优雅。事实上,性能并不相关,这是一个两遍解决方案。但我喜欢它,因为它可读性很强。此代码可读性很好,但效率不高。想象一个非常长的字符串gth说查找第一个x需要5分钟。然后第二次扫描查找xx需要另外5分钟,这将是不正确的。相反,一旦找到,它应该只检查下一个可用字符,并返回结果,而不是重复扫描。“也许性能更好”肯定是这样。想象一下字符串“xaaaaaaaaa…(100万件不是xs的东西)xx”。