Search code examples
javafor-loopfilternested-loopsprofanity

Efficient alternative to nested For Loop


I am doing profanity filter. I have 2 for loops nested as shown below. Is there a better way of avoiding nested for loop and improve time complexity.

boolean isProfane = false;
final String phraseInLowerCase = phrase.toLowerCase();
for (int start = 0; start < phraseInLowerCase.length(); start++) {
    if (isProfane) {
        break;
    }
    for (int offset = 1; offset < (phraseInLowerCase.length() - start + 1 ); offset++) {
        String subGeneratedCode = phraseInLowerCase.substring(start, start + offset);
        //BlacklistPhraseSet is a HashSet which contains all profane words
        if (blacklistPhraseSet.contains(subGeneratedCode)) {
            isProfane=true;
            break;
        }
    }
}

Solution

  • Consider Java 8 version of @Mad Physicist implementation:

            boolean isProfane = Stream.of(phrase.split("\\s+"))
                .map(String::toLowerCase)
                .anyMatch(w -> blacklistPhraseSet.contains(w));
    

    or

            boolean isProfane = Stream.of(phrase
                .toLowerCase()
                .split("\\s+"))
                .anyMatch(w -> blacklistPhraseSet.contains(w));