import java.util.BitSet;
import java.util.Collection;
+import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
+import java.util.TreeSet;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.lang.UCharacterCategory;
* @return display form
* @internal
*/
- public static String displayAlternates(Collection<BitSet> alternates) {
+ public static String displayAlternates(Set<BitSet> alternates) {
+ if (alternates.size() == 0) {
+ return "";
+ }
StringBuilder result = new StringBuilder();
- for (BitSet item : alternates) {
+ Comparator<? super BitSet> foo;
+ // for consistent results
+ Set<BitSet> sorted = new TreeSet<BitSet>(BITSET_COMPARATOR);
+ sorted.addAll(alternates);
+ for (BitSet item : sorted) {
if (result.length() != 0) {
result.append("; ");
}
}
return result.toString();
}
+
+ /**
+ * Order BitSets, first by shortest, then by items.
+ * @internal
+ */
+ public static final Comparator<BitSet> BITSET_COMPARATOR = new Comparator<BitSet>() {
+
+ public int compare(BitSet arg0, BitSet arg1) {
+ int diff = arg0.cardinality() - arg1.cardinality();
+ if (diff != 0) return diff;
+ int i0 = arg0.nextSetBit(0);
+ int i1 = arg1.nextSetBit(0);
+ while ((diff = i0-i1) == 0) {
+ i0 = arg0.nextSetBit(i0+1);
+ i1 = arg1.nextSetBit(i1+1);
+ }
+ return diff;
+ }
+
+ };
/**
* Produce a readable string of a set of scripts
assertTrue("", IdentifierInfo.contains(bitset12, bitset12));
assertTrue("", !IdentifierInfo.contains(bitset2, bitset12));
+ assertTrue("", IdentifierInfo.BITSET_COMPARATOR.compare(
+ IdentifierInfo.set(new BitSet(), UScript.ARABIC),
+ IdentifierInfo.set(new BitSet(), UScript.LATIN)) < 0);
// displayAlternates(Collection<BitSet>)
// displayScripts(BitSet)
String scriptString = IdentifierInfo.displayScripts(bitset12);
assertEquals("", "Hang Latn", scriptString);
Set<BitSet> alternates = new HashSet(Arrays.asList(bitset12, bitset2));
String alternatesString = IdentifierInfo.displayAlternates(alternates);
- assertEquals("", "Hang Latn; Hang", alternatesString);
+ assertEquals("", "Hang; Hang Latn", alternatesString);
// parseAlternates(String)
// parseScripts(String)