diff --git a/java-strings/pom.xml b/java-strings/pom.xml old mode 100644 new mode 100755 index a43490ce5c..ab94c28d4d --- a/java-strings/pom.xml +++ b/java-strings/pom.xml @@ -68,6 +68,21 @@ emoji-java 4.0.0 + + + org.junit.jupiter + junit-jupiter-api + 5.3.1 + test + + + + org.hamcrest + hamcrest-library + 1.3 + test + + org.passay @@ -79,6 +94,7 @@ commons-text 1.4 + @@ -115,4 +131,4 @@ 26.0-jre - \ No newline at end of file + diff --git a/java-strings/src/main/java/com/baeldung/string/searching/WordIndexer.java b/java-strings/src/main/java/com/baeldung/string/searching/WordIndexer.java new file mode 100644 index 0000000000..5314efb0b4 --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/searching/WordIndexer.java @@ -0,0 +1,42 @@ +package com.baeldung.string.searching; + +import java.util.ArrayList; +import java.util.List; + +public class WordIndexer { + + public List findWord(String textString, String word) { + int index = 0; + List indexes = new ArrayList(); + String lowerCaseTextString = textString.toLowerCase(); + String lowerCaseWord = word.toLowerCase(); + + while(index != -1){ + index = lowerCaseTextString.indexOf(lowerCaseWord, index + 1); + if (index != -1) { + indexes.add(index); + } + } + return indexes; + } + + + + public List findWordUpgrade(String textString, String word) { + int index = 0; + List indexes = new ArrayList(); + StringBuilder output = new StringBuilder(); + String lowerCaseTextString = textString.toLowerCase(); + String lowerCaseWord = word.toLowerCase(); + int wordLength = 0; + + while(index != -1){ + index = lowerCaseTextString.indexOf(lowerCaseWord, index + wordLength); // Slight improvement + if (index != -1) { + indexes.add(index); + } + wordLength = word.length(); + } + return indexes; + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/searching/WordIndexerUnitTest.java b/java-strings/src/test/java/com/baeldung/string/searching/WordIndexerUnitTest.java new file mode 100644 index 0000000000..f3f76db01f --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/searching/WordIndexerUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.string.searching; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +public class WordIndexerUnitTest { + + String theString; + WordIndexer wordIndexer; + + @BeforeEach + public void setUp() throws Exception { + wordIndexer = new WordIndexer(); + + theString = "To be, or not to be: that is the question: " + + "Whether 'tis nobler in the mind to suffer " + + "The slings and arrows of outrageous fortune, " + + "Or to take arms against a sea of troubles, " + + "And by opposing end them? To die: to sleep; " + + "No more; and by a sleep to say we end " + + "The heart-ache and the thousand natural shocks " + + "That flesh is heir to, 'tis a consummation " + + "Devoutly to be wish'd. To die, to sleep; " + + "To sleep: perchance to dream: ay, there's the rub: " + + "For in that sleep of death what dreams may come,"; + } + + @Test + + public void givenWord_whenSearching_thenFindAllIndexedLocations() { + List expectedResult = Arrays.asList(7, 122, 130, 221, 438); + + List actualResult = wordIndexer.findWord(theString, "or"); + + assertEquals(expectedResult, actualResult); + } + + @Test + public void givenWordWithNoRepeatCharacters_whenImprovedSearching_thenFindAllIndexedLocations() { + List expectedResult = Arrays.asList(7, 122, 130, 221, 438); + + List actualResult = wordIndexer.findWordUpgrade(theString, "or"); + + assertEquals(expectedResult, actualResult); + } + + + @Test + public void givenWord_whenSearching_thenFindAtEndOfString() { + List expectedResult = Arrays.asList(480); + + List actualResult = wordIndexer.findWordUpgrade(theString, "come,"); + + assertEquals(expectedResult, actualResult); + } +}