]> source.dussan.org Git - poi.git/commitdiff
add StringUtil.count, inspired by Apache Commons Lang StringUtils#countMatches and...
authorJaven O'Neal <onealj@apache.org>
Wed, 19 Oct 2016 23:04:16 +0000 (23:04 +0000)
committerJaven O'Neal <onealj@apache.org>
Wed, 19 Oct 2016 23:04:16 +0000 (23:04 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1765730 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/util/StringUtil.java
src/testcases/org/apache/poi/util/TestStringUtil.java

index 6272c14e50a03fed4aff6ed5427a49106585d156..2b8c81fdd136a8bcb3859f0c677f0e998975198a 100644 (file)
@@ -590,4 +590,24 @@ public class StringUtil {
    public static String join(String separator, Object... array) {
        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;
+   }
 }
index 002c8dcd2ded51ad56b916f6ff296c821b3c95e1..122ec408d987ff1e557bf71d6b9dd8cec88e94bc 100644 (file)
@@ -192,5 +192,24 @@ public class TestStringUtil {
         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
     }
+    
+    @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'));
+    }
 }