public static String distribute(Collection<TabStopString> units) { TreeSet<TabStopString> sortedUnits = new TreeSet<>(); sortedUnits.addAll(units); StringBuffer sb = new StringBuffer(); int used = 0; for (TabStopString t : sortedUnits) { used = sb.codePointCount(0, sb.length()); if (used > t.getPosition()) { throw new RuntimeException("Cannot layout cell."); } int amount = t.getPosition() - used; switch (t.getAlignment()) { case LEFT: // ok break; case CENTER: amount -= t.length() / 2; break; case RIGHT: amount -= t.length(); break; } sb.append(StringTools.fill(t.getPattern(), amount)); sb.append(t.getText()); } return sb.toString(); }