我有字符串
a.b.c.d
我想数一下'的出现次数。,最好是一句单句俏皮话。
(之前我把这个约束表述为“不使用循环”,以防你想知道为什么每个人都试图在不使用循环的情况下回答)。
我有字符串
a.b.c.d
我想数一下'的出现次数。,最好是一句单句俏皮话。
(之前我把这个约束表述为“不使用循环”,以防你想知道为什么每个人都试图在不使用循环的情况下回答)。
当前回答
String[] parts = text.split(".");
int occurances = parts.length - 1;
" It's a great day at O.S.G. Dallas! "
-- Famous Last Words
好吧,这是一个了解Java的情况,特别是对Java中已经可用的集合类的基本理解。如果你看了整篇文章,除了斯蒂芬·霍金对宇宙起源的解释,达尔文关于进化论的平装书,以及吉恩·罗登贝瑞的《星际迷航》演员选择,他们为什么选择威廉·夏特纳,除了如何快速简单地做到这一点……
... 我还需要多说吗?
其他回答
这是一个稍微不同风格的递归解决方案:
public static int countOccurrences(String haystack, char needle)
{
return countOccurrences(haystack, needle, 0);
}
private static int countOccurrences(String haystack, char needle, int accumulator)
{
if (haystack.length() == 0) return accumulator;
return countOccurrences(haystack.substring(1), needle, haystack.charAt(0) == needle ? accumulator + 1 : accumulator);
}
这个怎么样。它没有在底层使用regexp,因此应该比其他一些解决方案更快,并且不会使用循环。
int count = line.length() - line.replace(".", "").length();
为什么不只是分割字符,然后得到结果数组的长度。数组长度总是实例数+ 1。对吧?
好的,受Yonatan解决方案的启发,这里有一个纯递归的库方法-唯一使用的库方法是length()和charAt(),它们都不做任何循环:
public static int countOccurrences(String haystack, char needle)
{
return countOccurrences(haystack, needle, 0);
}
private static int countOccurrences(String haystack, char needle, int index)
{
if (index >= haystack.length())
{
return 0;
}
int contribution = haystack.charAt(index) == needle ? 1 : 0;
return contribution + countOccurrences(haystack, needle, index+1);
}
递归是否算作循环取决于您使用的确切定义,但这可能是您能得到的最接近的定义。
我不知道现在大多数jvm是否都做尾递归…当然,如果不是这样,对于适当长的字符串就会出现同名堆栈溢出。
lambda一行代码 不需要外部库。 用每个字符的计数创建一个映射:
Map<Character,Long> counts = "a.b.c.d".codePoints().boxed().collect(
groupingBy( t -> (char)(int)t, counting() ) );
获取:{a=1, b=1, c=1, d=1, .=3} 某一人物的数目。”。’已经结束了: 计数。('。”)
(出于病态的好奇心,我也写了一个lambda解,想知道我的解有多慢,最好是来自有10行解的人。)