Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a faster method to match an arbitrary String to month name in Java

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?

like image 397
jonc Avatar asked May 21 '10 03:05

jonc


1 Answers

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]));

  }
}
like image 69
dbyrne Avatar answered Sep 24 '22 20:09

dbyrne