import java.text.Collator; import java.text.ParseException; import java.text.RuleBasedCollator; import java.text.spi.CollatorProvider; import java.util.Locale; public class MyCollatorProvider extends CollatorProvider { private static final Locale EN_US_CASEINSENSITIVE = new Locale("en", "US", "caseinsensitive"); private static final Locale EN_US_GREEK = new Locale("en", "US", "greek"); @Override public Locale[] getAvailableLocales() { return new Locale[] { EN_US_CASEINSENSITIVE, EN_US_GREEK }; } @Override public Collator getInstance(Locale locale) { if (locale.equals(EN_US_CASEINSENSITIVE)) { Collator c = Collator.getInstance(Locale.US); // Ignore tertiary differences (case differences) c.setStrength(Collator.SECONDARY); return c; } else if (locale.equals(EN_US_GREEK)) { StringBuilder rules = new StringBuilder(); // alpha should go between a and b rules.append("< a,A < \u03b1 < b,B"); // beta should go between b and c rules.append("& b,B < \u03b2 < c,C"); // add more rules here .... try { return new RuleBasedCollator(rules.toString()); } catch (ParseException pe) { throw new Error(pe); } } else { throw new IllegalArgumentException(locale.toString()); } } }