1 package org.unicode.cldr.util; 2 3 import com.ibm.icu.text.BreakIterator; 4 import com.ibm.icu.util.ULocale; 5 6 public class RangeAbbreviator { 7 private BreakIterator breaker1; 8 private BreakIterator breaker2; 9 private String separator; 10 private StringBuilder buffer = new StringBuilder(); 11 12 public RangeAbbreviator(BreakIterator breaker, String separator) { 13 this.breaker1 = (BreakIterator) breaker.clone(); 14 this.breaker2 = (BreakIterator) breaker.clone(); 15 this.separator = separator; 16 } 17 18 public RangeAbbreviator(ULocale breaker, String separator) { 19 this(BreakIterator.getWordInstance(breaker), separator); 20 } 21 22 public String abbreviate(String firstString, String secondString) { 23 if (firstString.equals(secondString)) { 24 return firstString; 25 } 26 buffer.setLength(0); 27 breaker1.setText(firstString); 28 breaker2.setText(secondString); 29 30 // find common initial section 31 // we use two offset variables, in case we want to have some kind of equivalence later. 32 int start1 = breaker1.first(); 33 int start2 = breaker2.first(); 34 while (true) { 35 breaker1.next(); 36 final int current1 = breaker1.current(); 37 if (current1 == BreakIterator.DONE) { 38 break; 39 } 40 breaker2.next(); 41 final int current2 = breaker2.current(); 42 if (current2 == BreakIterator.DONE) { 43 break; 44 } 45 if (!firstString.regionMatches(start1, secondString, start2, current1 - start1)) { 46 break; 47 } 48 start1 = current1; 49 start2 = current2; 50 } 51 52 // find common initial section 53 int end1 = breaker1.last(); 54 while (true) { 55 breaker1.previous(); 56 final int current1 = breaker1.current(); 57 if (current1 == BreakIterator.DONE) { 58 break; 59 } 60 breaker2.previous(); 61 final int current2 = breaker2.current(); 62 if (current2 == BreakIterator.DONE) { 63 break; 64 } 65 if (!firstString.regionMatches(current1, secondString, current2, end1 - current1)) { 66 break; 67 } 68 end1 = current1; 69 } 70 return buffer.append(firstString.substring(0, end1)).append(separator).append(secondString.substring(start2)) 71 .toString(); 72 } 73 }