diff --git a/src/main/java/com/epam/izh/rd/online/service/SimpleTextStatisticsAnalyzer.java b/src/main/java/com/epam/izh/rd/online/service/SimpleTextStatisticsAnalyzer.java index 32f8e35..1cbe25e 100644 --- a/src/main/java/com/epam/izh/rd/online/service/SimpleTextStatisticsAnalyzer.java +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleTextStatisticsAnalyzer.java @@ -3,8 +3,8 @@ import com.epam.izh.rd.online.helper.Direction; import java.util.*; - -import static java.util.Collections.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Совет: @@ -16,14 +16,20 @@ public class SimpleTextStatisticsAnalyzer implements TextStatisticsAnalyzer { /** - * Необходимо реализовать функционал подсчета суммарной длины всех слов (пробелы, знаким препинания итд не считаются). - * Например для текста "One, I - tWo!!" - данный метод должен вернуть 7. + * Необходимо реализовать функционал подсчета суммарной длины всех слов (пробелы, знаки препинания и т.д. не считаются). + * Например, для текста "One, I - tWo!!" - данный метод должен вернуть 7. * * @param text текст */ @Override public int countSumLengthOfWords(String text) { - return 0; + final List listOfWords = getWords(text); + Iterator iterateInListOfWords = listOfWords.iterator(); + int lengthOfAllWordsInText = 0; + while (iterateInListOfWords.hasNext()) { + lengthOfAllWordsInText += iterateInListOfWords.next().length(); + } + return lengthOfAllWordsInText; } /** @@ -34,30 +40,39 @@ public int countSumLengthOfWords(String text) { */ @Override public int countNumberOfWords(String text) { - return 0; + final List listOfWords = getWords(text); + return listOfWords.size(); } /** * Необходимо реализовать функционал подсчета количества уникальных слов в тексте (с учетом регистра). - * Например для текста "One, two, three, three - one, tWo, tWo!!" - данный метод должен вернуть 5. + * Например, для текста "One, two, three, three - one, tWo, tWo!!" - данный метод должен вернуть 5. * param text текст */ @Override public int countNumberOfUniqueWords(String text) { - return 0; + final List listOfWords = getWords(text); + HashSet onlyUniqueWords = new HashSet<>(listOfWords); + return onlyUniqueWords.size(); } /** * Необходимо реализовать функционал получения списка слов из текста. * Пробелы, запятые, точки, кавычки и другие знаки препинания являются разделителями слов. - * Например для текста "One, two, three, three - one, tWo, tWo!!" должен вернуться список : + * Например для текста "One, two, three, three - one, tWo, tWo!!" должен вернуться список: * {"One", "two", "three", "three", "one", "tWo", "tWo"} * * @param text текст */ @Override public List getWords(String text) { - return emptyList(); + final Pattern patternFindWordForWord = Pattern.compile("\\w+"); + final Matcher matcherFindWordForWord = patternFindWordForWord.matcher(text); + final List listOfWords = new ArrayList<>(); + while (matcherFindWordForWord.find()) { + listOfWords.add(matcherFindWordForWord.group()); + } + return listOfWords; } /** @@ -70,7 +85,9 @@ public List getWords(String text) { */ @Override public Set getUniqueWords(String text) { - return emptySet(); + final List listOfWords = getWords(text); + HashSet onlyUniqueWords = new HashSet<>(listOfWords); + return onlyUniqueWords; } /** @@ -82,7 +99,16 @@ public Set getUniqueWords(String text) { */ @Override public Map countNumberOfWordsRepetitions(String text) { - return emptyMap(); + final List listOfWords = getWords(text); + Map resultMap = new HashMap<>(); + for (String elementOfList : listOfWords) { + if (resultMap.containsKey(elementOfList)) { + resultMap.put(elementOfList, resultMap.get(elementOfList) + 1); + } else { + resultMap.put(elementOfList, 1); + } + } + return resultMap; } /** @@ -95,6 +121,17 @@ public Map countNumberOfWordsRepetitions(String text) { */ @Override public List sortWordsByLength(String text, Direction direction) { - return emptyList(); + final List listOfWords = getWords(text); + List ascDesc = listOfWords; + Collections.sort(ascDesc, new Comparator() { + @Override + public int compare(String s1, String s2) { + return s1.length() - s2.length(); + } + }); + if (direction == Direction.DESC) { + Collections.reverse(ascDesc); + } + return ascDesc; } } diff --git a/src/main/java/com/epam/izh/rd/online/service/StreamApiTextStatisticsAnalyzer.java b/src/main/java/com/epam/izh/rd/online/service/StreamApiTextStatisticsAnalyzer.java index e9b8957..30d1879 100644 --- a/src/main/java/com/epam/izh/rd/online/service/StreamApiTextStatisticsAnalyzer.java +++ b/src/main/java/com/epam/izh/rd/online/service/StreamApiTextStatisticsAnalyzer.java @@ -2,12 +2,11 @@ import com.epam.izh.rd.online.helper.Direction; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import static java.util.Collections.*; /** * Данный класс обязан использовать StreamApi из функционала Java 8. Функциональность должна быть идентична @@ -16,36 +15,54 @@ public class StreamApiTextStatisticsAnalyzer implements TextStatisticsAnalyzer { @Override public int countSumLengthOfWords(String text) { - return 0; + return getWords(text) + .stream() + .mapToInt(String::length) + .sum(); } @Override public int countNumberOfWords(String text) { - return 0; + return getWords(text) + .size(); } @Override public int countNumberOfUniqueWords(String text) { - return 0; + return getWords(text) + .stream() + .distinct() + .collect(Collectors.toList()) + .size(); } @Override public List getWords(String text) { - return emptyList(); + final List listOfWords = Stream.of(text.split("\\W+")) + .collect(Collectors.toList()); + return listOfWords; } @Override public Set getUniqueWords(String text) { - return emptySet(); + return Stream.of(getWords(text)) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); } @Override public Map countNumberOfWordsRepetitions(String text) { - return emptyMap(); + return Stream.of(getWords(text)) + .flatMap(Collection::stream) + .collect(Collectors.toMap(Function.identity(), v -> 1, Integer::sum)); } @Override public List sortWordsByLength(String text, Direction direction) { - return emptyList(); + Comparator comparator = Comparator.comparingInt(String::length); + return getWords(text) + .stream() + .sorted((direction.equals(Direction.ASC) ? comparator : comparator.reversed())) + .collect(Collectors.toList()); } } diff --git a/src/test/java/com/epam/izh/rd/online/TextAnalyzerTest.java b/src/test/java/com/epam/izh/rd/online/TextAnalyzerTest.java index a64df2f..c0dad58 100644 --- a/src/test/java/com/epam/izh/rd/online/TextAnalyzerTest.java +++ b/src/test/java/com/epam/izh/rd/online/TextAnalyzerTest.java @@ -146,7 +146,7 @@ private static List readWordsFromProperties() { List result = new ArrayList<>(); for (Map.Entry entry : properties.entrySet()) { - int wordRepetition = Integer.valueOf(entry.getValue().toString()); + int wordRepetition = Integer.parseInt(entry.getValue().toString()); String word = entry.getKey().toString(); if (wordRepetition == 1) {