I’m trying find the most popular word in an array using Hashtables. For some reason the while loop is looping infinitely. I’ve debugged and the element never changes from the first one it gets. Any ideas on why this is happening?
Here is my code:
import java.util.Hashtable;
public class MyClass {
public String mostPopularString (String []words) {
if (words == null)
return null;
if (words.length == 0)
return null;
Hashtable<String, Integer> wordsHash = new Hashtable<String, Integer>();
for (String thisWord : words)
{
if (wordsHash.containsKey(thisWord))
{
wordsHash.put(thisWord, wordsHash.get(thisWord) + 1);
}
else
{
wordsHash.put(thisWord, 1);
}
}
Integer mostPopularCount = 0;
String mostPopularWord = null;
boolean tie = false;
while (wordsHash.keys().hasMoreElements())
{
String currentWord = (String) wordsHash.keys().nextElement();
if (wordsHash.get(currentWord) > mostPopularCount)
{
mostPopularCount = wordsHash.get(currentWord);
mostPopularWord = currentWord;
tie = false;
}
else if (wordsHash.get(currentWord) == mostPopularCount)
{
tie = true;
}
}
if (tie)
return null;
else
return mostPopularWord;
}
}
You’re calling
wordsHash.keys()on each iteration of the loop, which gives you a freshEnumeration<String>on each iteration – you’re then calling it again inside the loop.You want to call it once, and then iterate over the single
Enumeration<String>:Note that as you’re also getting the value for each element, you’d be better off iterating over the
entrySet()rather than thekeys().You’d also be better off using
HashMapinstead ofHashtable, as then you could just use an enhanced for loop…