import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
class PigLatinTranslator {
private static final HashSet < Character > vowels = new HashSet < Character > (Arrays.asList('a', 'e', 'i', 'o', 'u'));
private static final HashSet < String > specials = new HashSet < String > (Arrays.asList("xr", "yt"));
public String translate(String phrase) {
ArrayList < String > piggyfied = new ArrayList < String > ();
var words = phrase.split(" ");
for (String word: words) {
if (vowels.contains(word.charAt(0)) || specials.contains(word.substring(0, 2))) {
piggyfied.add(word + "ay");
continue;
}
var length = word.length();
for (int pos = 1; pos < length; pos++) {
var letter = word.charAt(pos);
if (vowels.contains(letter) || letter == 'y') {
if (letter == 'u' && word.charAt(pos - 1) == 'q') pos += 1;
piggyfied.add(word.substring(pos) + word.substring(0, pos) + "ay");
break;
}
}
}
return String.join(" ", piggyfied);
}
}
This approach starts by importing from packages for what will be needed.
The class defines two private
static
final
HashSet
s to define the vowels
and special letter sequences.
They are private
because they don't need to be directly accessed from outside the class, and final
because they don't need to be reassigned after being created.
They are static
because they don't need to differ between object instantiations, so they can belong to the class itself.
The translate()
method starts by defining the ArrayList()
to hold the words to be output.
The input String
is then split()
on a space to create the array of words.
A for-each loop is used to iterate the words.
An if
statement checks if the first character in the word is a vowel.
It does this by using the String
charAt()
method to get the character at the first index of the word.
It then uses the HashSet
contains()
method to see if the HashSet
of vowels contains the character.
If so, the logical OR operator (||
) short circuits and ay
is concatenated to the word, which is then
add
ed to the output ArrayList
, and the loop continues.
If the first character is not a vowel, the other side of the OR
operator checks if the first two characters
of the word are a special sequence.
It does this by using the String
substring()
method to get a String
of the first two characters
of the word.
It then uses the HashSet.contains()
method to see if the HashSet
of special sequences contains the substring.
If so, then ay
is concatenated to the word, which is then added to the ArrayList
, and the loop continues.
If the word does not start with a vowel or special sequence of letters, then the length of the word
is set to prepare for iterating through the word characters, starting with the second character at index 1
.
Inside a for
loop, the character at the current iterating index is set.
The HashSet.contains()
method is used to see if the HashSet
of vowels contains the character.
If not, the other side of the logical OR
operator checks to see if the character is a y
.
If the character is a vowel or y
, then the character is checked to see if it is a u
, and, if so,
if the previous character is a q
.
If the index is at the end of a qu
sequence, then the index is incremented by 1
, otherwise the index is left as is.
Finally, the word is made into Pig Latin by getting a substring()
from the index until the end of the word,
to which is concatenated a substring()
from the beginning of the word up to but not including the indexed character,
and concatenating ay
.
Note that there are two overloads of the substring()
method.
One takes one argument which will return a substring from the index of the argument until the end of the String
.
The other takes two arguments: the starting index and the ending index.
It returns a substring from the starting index up to but not including the ending index.
After all of the words are iterated, the ArrayList
of words is assembled into a single String
by using the
String.join()
method to join all of the words together, separated by a single space,
and that String
is returned from the function.