everyone. I have a task- reverse every word in a sentence as long as the word is 5 or more letters long. The program has been working with most words, but after a couple, the words are not included. Does anyone know why this is happening? Here is the code:
public static int wordCount(String str) {
int count = 0;
for(int i = 0; i < str.length(); i ) if(str.charAt(i) == ' ') count ;
return count 1;
}
This just gets the word count for me, which I use in a for loop later to loop through all the words.
public static String reverseString(String s) {
Stack<Character> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i ) {
stack.push(s.charAt(i));
}
while (!stack.empty()) {
sb.append(stack.pop());
}
return sb.toString();
}
This reverses a single string. This is not where I reverse certain words- this reverses a string. "Borrowed" from https://stackoverflow.com/a/33458528/16818831.
Lastly, the actual function:
public static String spinWords(String sentence) {
String ans = "";
for(int i = 0; i <= wordCount(sentence); i ) {
if(sentence.substring(0, sentence.indexOf(' ')).length() >= 5) {
ans = reverseString(sentence.substring(0, sentence.indexOf(' '))) " ";
sentence = sentence.substring(sentence.indexOf(' ') 1);
} else {
ans = sentence.substring(0, sentence.indexOf(' ')) " ";
sentence = sentence.substring(sentence.indexOf(' ') 1);
}
}
return ans;
}
This is where my mistake probably is. I'd like to know why some words are omitted. Just in case, here is my main method:
public static void main(String[] args) {
System.out.println(spinWords("Why, hello there!"));
System.out.println(spinWords("The weather is mighty fine today!"));
}
Let me know why this happens. Thank you!
CodePudding user response:
I think you should rewrite a lot of your code using String.split(). Instead of manually parsing every letter, you can get an array of every word just by writing String[] arr = sentence.split(" "). You can then use a for loop to go through and reverse each word something like this
for (int i=0; i<arr.length; i ) {
if (arr[i] >= 5) {
arr[i] = reverse(arr[i])
}
}
I know you just asked for a solution to your current code, but this would probably get you a better grade :)
CodePudding user response:
The main issue would appear to be the for loop condition in spinWords()
The word count of your sentence keeps getting shorter while at the same time, i increases.
For example:
- i is 0 when the word count is 5
- i is 1 when the word count is 4
- i is 2 when the word count is 3
- i is 3 when the word count is 2 which stops the loop.
It can't get through the whole sentence.
As many have mentioned, using the split method would help greatly, for example:
public static String spinWords(String sentence) {
StringJoiner ans = new StringJoiner(" ");
List<String> words = Arrays.asList(sentence.split(" "));
words.forEach(word -> ans.add(word.length() < 5 ? word : new StringBuilder(word).reverse().toString()));
return ans.toString();
}