Reputation: 153
Here's ultimately what I need to do:
I have an ArrayList
called originalList that looks like
[pans, pots, sit, it's, naps]
and another ArrayList
called modifiedList that takes originalList and removes punctuation and uppercase and then sorts the list. So it would look like
[anps, anps, ist, ist, opst]
modifiedList's purpose is to tell me what words are anagrams of each other. An anagram is a word that consist of the same letters. The problem is I need to sort originalList to match modifiedList so that I can output what words are anagrams of each other. originalList would need to become [pans, naps, sit, it's, pots]
. Suggestions?
Upvotes: 3
Views: 433
Reputation: 9178
public static void main(String args[]){
ArrayList<String> alOriginal = new ArrayList<String>();
alOriginal.add("pans");
alOriginal.add("pots");
alOriginal.add("sit");
alOriginal.add("it's");
alOriginal.add("naps");
ArrayList<String> alAnagram = getSortedAnagramStrings(alOriginal);
System.out.println(alOriginal);
System.out.println(alAnagram);
}
public static java.util.ArrayList<String> getSortedAnagramStrings(ArrayList<String> original){
ArrayList<String> alAnagramStrings = new ArrayList<String>();
for (String currentString : original) {
// Remove punctuation
char[] anagramChars = currentString.replace("'", "").toCharArray();
// Sort characters
Arrays.sort(anagramChars);
// Prepare string
String anagramString = new String(anagramChars);
// Add to array list
alAnagramStrings.add(anagramString);
}
// Simple sort logic
for (int index = 0; index < alAnagramStrings.size(); index ++){
for (int index1 = index + 1; index1 < alAnagramStrings.size(); index1 ++){
// If both anagram strings are same
if(alAnagramStrings.get(index).compareTo(alAnagramStrings.get(index1)) == 0){
// Compare original strings
if (original.get(index).compareTo(original.get(index1)) > 0){
String temp =original.get(index);
original.set(index, original.get(index1));
original.set(index1, temp);
}else{
String temp =original.get(index);
original.set(index1, original.get(index));
original.set(index, temp);
}
}else if(alAnagramStrings.get(index).compareTo(alAnagramStrings.get(index1)) > 0){
String temp =alAnagramStrings.get(index);
alAnagramStrings.set(index, alAnagramStrings.get(index1));
alAnagramStrings.set(index1, temp);
String temp1 =original.get(index);
original.set(index, original.get(index1));
original.set(index1, temp1);
}
}
}
return alAnagramStrings;
}
Upvotes: 1
Reputation: 692081
Don't use an additional list. Sort your original list using a comparator that "normalizes" the two words to compare, and then compares their normalized values (by normalizing, I mean transforming naps
into anps
).
You'll then have your anagrams next to each other in the list.
Upvotes: 5