diff --git a/java-collections.iml b/java-collections.iml new file mode 100644 index 0000000..dd43669 --- /dev/null +++ b/java-collections.iml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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..18fbca7 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,9 @@ import com.epam.izh.rd.online.helper.Direction; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; -import static java.util.Collections.*; /** * Совет: @@ -23,7 +24,12 @@ public class SimpleTextStatisticsAnalyzer implements TextStatisticsAnalyzer { */ @Override public int countSumLengthOfWords(String text) { - return 0; + List words = getWords(text); + int countOfWords = 0; + for (String word : words) { + countOfWords += word.length(); + } + return countOfWords; } /** @@ -34,7 +40,8 @@ public int countSumLengthOfWords(String text) { */ @Override public int countNumberOfWords(String text) { - return 0; + List words = getWords(text); + return words.size(); } /** @@ -44,7 +51,16 @@ public int countNumberOfWords(String text) { */ @Override public int countNumberOfUniqueWords(String text) { - return 0; + List words = getWords(text); + List repeatedWords = new ArrayList<>(); + int counterOfUniqueWords = 0; + for (String word : words) { + if (!repeatedWords.contains(word)) { + repeatedWords.add(word); + counterOfUniqueWords++; + } + } + return counterOfUniqueWords; } /** @@ -57,7 +73,11 @@ public int countNumberOfUniqueWords(String text) { */ @Override public List getWords(String text) { - return emptyList(); + Pattern pattern = Pattern.compile("[\\W+]"); + Matcher matcher = pattern.matcher(text); + String textIntermediateVersion = matcher.replaceAll("1"); + + return Arrays.asList(textIntermediateVersion.split("1+")); } /** @@ -70,7 +90,9 @@ public List getWords(String text) { */ @Override public Set getUniqueWords(String text) { - return emptySet(); + List words = getWords(text); + return new HashSet<>(words); + } /** @@ -82,9 +104,29 @@ public Set getUniqueWords(String text) { */ @Override public Map countNumberOfWordsRepetitions(String text) { - return emptyMap(); + List words = getWords(text); + List repeatedWords = new ArrayList<>(); + Map countedWords = new HashMap<>(); + for (String word : words) { + if (!repeatedWords.contains(word)) { + countedWords.put(word, countRepeats(word, words)); + repeatedWords.add(word); + } + } + return countedWords; + + } + + private int countRepeats(String word, List list) { + int counter = 0; + for (String wordInList : list) { + counter += wordInList.equals(word) ? 1 : 0; + } + return counter; + } + /** * Необходимо реализовать функционал вывода слов из текста в отсортированном виде (по длине) в зависимости от параметра direction. * Например для текста "Hello, Hi, mother, father - good, cat, c!!" должны вернуться результаты : @@ -95,6 +137,11 @@ public Map countNumberOfWordsRepetitions(String text) { */ @Override public List sortWordsByLength(String text, Direction direction) { - return emptyList(); + List words = getWords(text); + Comparator comparator = Comparator.comparing(String::length); + comparator = direction == Direction.ASC ? comparator : comparator.reversed(); + words.sort(comparator); + + return words; } } 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..b979f14 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,10 @@ 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 static java.util.Collections.*; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * Данный класс обязан использовать StreamApi из функционала Java 8. Функциональность должна быть идентична @@ -16,36 +14,62 @@ public class StreamApiTextStatisticsAnalyzer implements TextStatisticsAnalyzer { @Override public int countSumLengthOfWords(String text) { - return 0; + List words = getWords(text); + return words.stream().reduce(0, (sum, s) -> sum += s.length(), Integer::sum); } + @Override public int countNumberOfWords(String text) { - return 0; + List words = getWords(text); + return words.stream().reduce(0, (sum, s) -> sum += 1, Integer::sum); + } @Override public int countNumberOfUniqueWords(String text) { - return 0; + List words = getWords(text); + List repeatedWords = new ArrayList<>(); + return (int) words.stream().filter((o1) -> !repeatedWords.contains(o1)).map(repeatedWords::add).count(); } @Override public List getWords(String text) { - return emptyList(); + Pattern pattern = Pattern.compile("[\\W+]"); + Matcher matcher = pattern.matcher(text); + + String textVer2 = matcher.replaceAll("1"); + String[] wordsArray = textVer2.split("1+"); + return Arrays.stream(wordsArray).collect(Collectors.toList()); + + } @Override public Set getUniqueWords(String text) { - return emptySet(); + List words = getWords(text); + return words.stream().collect(Collectors.toSet()); } @Override public Map countNumberOfWordsRepetitions(String text) { - return emptyMap(); + List words = getWords(text); + Set wordSet = new HashSet<>(words); + Map countedWords = new HashMap<>(); + wordSet.stream().forEach((s) -> countedWords.put(s, countRepeats(s, words))); + return countedWords; + } + + private int countRepeats(String word, List list) { + return (int) list.stream().filter(s -> s.equals(word)).count(); } @Override public List sortWordsByLength(String text, Direction direction) { - return emptyList(); + List words = getWords(text); + Comparator comparator = Comparator.comparing(String::length); + comparator = direction == Direction.ASC ? comparator : comparator.reversed(); + return words.stream().sorted(comparator).collect(Collectors.toList()); + } }