add StringUtil.count, inspired by Apache Commons Lang StringUtils#countMatches and Python's str.count(substr)

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1765730 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Javen O'Neal 2016-10-19 23:04:16 +00:00
parent 4b01accdb3
commit 5d3d50b9d1
2 changed files with 39 additions and 0 deletions

View File

@ -590,4 +590,24 @@ public class StringUtil {
public static String join(String separator, Object... array) { public static String join(String separator, Object... array) {
return join(array, separator); return join(array, separator);
} }
/**
* Count number of occurrences of needle in haystack
* Has same signature as org.apache.commons.lang3.StringUtils#countMatches
*
* @param haystack the CharSequence to check, may be null
* @param needle the character to count the quantity of
* @return the number of occurrences, 0 if the CharSequence is null
*/
public static int countMatches(CharSequence haystack, char needle) {
if (haystack == null) return 0;
int count = 0;
final int length = haystack.length();
for (int i=0; i<length; i++) {
if (haystack.charAt(i) == needle) {
count++;
}
}
return count;
}
} }

View File

@ -192,5 +192,24 @@ public class TestStringUtil {
assertEquals("abc|def|ghi", StringUtil.join("|", "abc", "def", "ghi")); assertEquals("abc|def|ghi", StringUtil.join("|", "abc", "def", "ghi"));
assertEquals("5|8.5|true|string", StringUtil.join("|", 5, 8.5, true, "string")); //assumes Locale prints number decimal point as a period rather than a comma assertEquals("5|8.5|true|string", StringUtil.join("|", 5, 8.5, true, "string")); //assumes Locale prints number decimal point as a period rather than a comma
} }
@Test
public void count() {
String test = "Apache POI project\n\u00a9 Copyright 2016";
// supports search in null or empty string
assertEquals("null", 0, StringUtil.countMatches(null, 'A'));
assertEquals("empty string", 0, StringUtil.countMatches("", 'A'));
assertEquals("normal", 2, StringUtil.countMatches(test, 'e'));
assertEquals("normal, should not find a in escaped copyright", 1, StringUtil.countMatches(test, 'a'));
// search for non-printable characters
assertEquals("null character", 0, StringUtil.countMatches(test, '\0'));
assertEquals("CR", 0, StringUtil.countMatches(test, '\r'));
assertEquals("LF", 1, StringUtil.countMatches(test, '\n'));
// search for unicode characters
assertEquals("Unicode", 1, StringUtil.countMatches(test, '\u00a9'));
}
} }