package org.unicode.cldr.util; import com.ibm.icu.text.BreakIterator; import com.ibm.icu.util.ULocale; public class RangeAbbreviator { private BreakIterator breaker1; private BreakIterator breaker2; private String separator; private StringBuilder buffer = new StringBuilder(); public RangeAbbreviator(BreakIterator breaker, String separator) { this.breaker1 = (BreakIterator) breaker.clone(); this.breaker2 = (BreakIterator) breaker.clone(); this.separator = separator; } public RangeAbbreviator(ULocale breaker, String separator) { this(BreakIterator.getWordInstance(breaker), separator); } public String abbreviate(String firstString, String secondString) { if (firstString.equals(secondString)) { return firstString; } buffer.setLength(0); breaker1.setText(firstString); breaker2.setText(secondString); // find common initial section // we use two offset variables, in case we want to have some kind of equivalence later. int start1 = breaker1.first(); int start2 = breaker2.first(); while (true) { breaker1.next(); final int current1 = breaker1.current(); if (current1 == BreakIterator.DONE) { break; } breaker2.next(); final int current2 = breaker2.current(); if (current2 == BreakIterator.DONE) { break; } if (!firstString.regionMatches(start1, secondString, start2, current1 - start1)) { break; } start1 = current1; start2 = current2; } // find common initial section int end1 = breaker1.last(); while (true) { breaker1.previous(); final int current1 = breaker1.current(); if (current1 == BreakIterator.DONE) { break; } breaker2.previous(); final int current2 = breaker2.current(); if (current2 == BreakIterator.DONE) { break; } if (!firstString.regionMatches(current1, secondString, current2, end1 - current1)) { break; } end1 = current1; } return buffer.append(firstString.substring(0, end1)).append(separator).append(secondString.substring(start2)) .toString(); } }