So, a long story short, I have a Java homework assignment that requires a long ArrayList of Strings to be manipulated in various ways (we’re doing things like showing combinations of words, adding and removing from the ArrayList, nothing too special). I noticed that a few of the provided ArrayLists have duplicate entries (and the duplicates aren’t necessary for this assignment), so I got the okay from my teacher to sanitize the data by removing duplicate entries.
Here’s what I came up with:
private static ArrayList<String> KillDups(ArrayList<String> ListOfStrings) {
for (int i = 0 ; i < ListOfStrings.size(); i++) {
for (int j = i + 1; j < ListOfStrings.size(); j++) {
//don't start on the same word or you'll eliminate it.
if ( ListOfStrings.get(i).toString().equalsIgnoreCase( ListOfStrings.get(j).toString() ) ) {
ListOfStrings.remove(j);//if they are the same, DITCH ONE.
j = j -1; //removing the word basically changes the index, so swing down one.
}
}
}
return ListOfStrings;
}
This is fine for my assignment, but I doubt it would be very useful in the real world. Is there a way to do this that would ignore white space and special characters during the comparison? Is there a cleaner way in general to handle this (maybe without the nested For Loops)? Is there another question I should be asking that I don’t know to ask?
Yes. And it can be done in just 1 (elegant) line:
The intermediate
Setensures no duplicates. TheLinkedHashSetimplementation ofSetwas chosen to preserve the order of the list.Also, on a style note:
List) rather than the concrete (ieArrayList) when specifying method signaturesYour whole method is then:
For extra brownie points make the method generic, so it works with any type of
List:If you wanted to ignore certain characters, I’d create a class for that and have a list of those. Both the
hashCode()and theequals()methods are relied upon byHashSetsto remove dups:then