I want to determine if a string is the name of a month and I want to do it relatively quickly. The function that is currently stuck in my brain is something like:
boolean isaMonth( String str ) {
String[] months = DateFormatSymbols.getInstance().getMonths();
String[] shortMonths = DateFormatSymbols.getInstance().getShortMonths();
int i;
for( i = 0; i<months.length(); ++i;) {
if( months[i].equals(str) ) return true;
if( shortMonths[i].equals(str ) return true;
}
return false;
}
However, I will be processing lots of text, passed one string at a time to this function, and most of the time I will be getting the worst case of going through the entire loop and returning false.
I saw another question that talked about a Regex to match a month name and a year which could be adapted for this situation. Would the Regex be faster? Is there any other solution that might be faster?
Why not store the month names in a HashSet
? This will give you constant time lookup instead of the linear time lookup you are getting from your loop.
import java.util.HashSet;
import java.util.Collections;
import java.text.DateFormatSymbols;
class Test {
public static void main(String[] args) {
HashSet<String> months = new HashSet<String>(24);
Collections.addAll(months, DateFormatSymbols.getInstance().getMonths());
Collections.addAll(months, DateFormatSymbols.getInstance().getShortMonths());
System.out.println(months.contains(args[0]));
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With