From 84b33037186b7f4a0a6f90a0c7588c1493b28285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Aguilera?= Date: Tue, 9 May 2017 13:46:11 +0100 Subject: [PATCH] Feature required in #73 (#77) --- src/main/java/strman/Strman.java | 25 ++++++++++++++++- src/test/java/strman/StrmanTest.java | 41 ++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/main/java/strman/Strman.java b/src/main/java/strman/Strman.java index 6eb774d..2486956 100644 --- a/src/main/java/strman/Strman.java +++ b/src/main/java/strman/Strman.java @@ -34,6 +34,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; +import static java.util.function.Function.identity; +import static java.util.stream.Collectors.counting; +import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.joining; /** @@ -87,7 +90,7 @@ public abstract class Strman { * @return an Optional String if found else empty */ public static Optional at(final String value, int index) { - if (value == null || value.isEmpty()) { + if (isNullOrEmpty(value)) { return Optional.empty(); } int length = value.length(); @@ -97,6 +100,10 @@ public abstract class Strman { return (index < length && index >= 0) ? Optional.of(String.valueOf(value.charAt(index))) : Optional.empty(); } + private static boolean isNullOrEmpty(String input) { + return input == null || input.isEmpty(); + } + /** * Returns an array with strings between start and end. * @@ -1302,4 +1309,20 @@ public abstract class Strman { } return countSubstr(value.substring(offset), subStr, allowOverlapping, ++count); } + + /** + * Counts the number of occurrences of each character in the string + * + * @param input The input string + * @return A map containing the number of occurrences of each character in the string + */ + public static Map charsCount(String input) { + if (isNullOrEmpty(input)) { + return Collections.emptyMap(); + } + + return input.chars() + .mapToObj(c -> (char) c) + .collect(groupingBy(identity(), counting())); + } } diff --git a/src/test/java/strman/StrmanTest.java b/src/test/java/strman/StrmanTest.java index 176253c..84f18f6 100644 --- a/src/test/java/strman/StrmanTest.java +++ b/src/test/java/strman/StrmanTest.java @@ -29,8 +29,7 @@ package strman; import org.junit.Ignore; import org.junit.Test; -import java.util.Arrays; -import java.util.Optional; +import java.util.*; import static java.util.stream.Collectors.toList; import static org.hamcrest.CoreMatchers.*; @@ -990,4 +989,42 @@ public class StrmanTest { assertThat(trimEnd("-_-abc!-_-", "_", "-", "!"), is(Optional.of("-_-abc"))); assertThat(trimEnd("-_-abc#-_-", "_", "-", "!", "#"), is(Optional.of("-_-abc"))); } + + + @Test + public void charsCount_shouldReturnEmptyWhenInputStringIsNull(){ + assertThat(charsCount(null), equalTo(Collections.emptyMap())); + } + + @Test + public void charsCount_shouldReturnEmptyWhenInputStringIsEmpty(){ + assertThat(charsCount(""), equalTo(Collections.emptyMap())); + } + + @Test + public void charsCount_shouldReturnCharsCountWhenInputIsASimpleString(){ + Map expectedOutput = new HashMap(){{ + put('a',1L); + put('b', 1L); + put('c', 1L); + }}; + + assertThat(charsCount("abc"), equalTo(expectedOutput)); + } + + @Test + public void charsCount_shouldReturnCharsCountWhenInputIsAComplexString(){ + Map expectedOutput = new HashMap(){{ + put('a',1L); + put('b', 2L); + put('c', 3L); + + put('A',1L); + put('B', 2L); + put('C', 3L); + put('-', 10L); + }}; + + assertThat(charsCount("-----abbcccCCCBBA-----"), equalTo(expectedOutput)); + } } \ No newline at end of file