実際には、すべてが可能ですが、意味がない場合があります。「長さ 5 のすべての文字列」でさえ、適切な順序付けの間隔ですが、 をRange
サポートしていてもサポートしてComparable
いないComparator
場合は、最初に文字列をラップする必要があります (結果の Range はまったく役に立たなくなります)。
@RequiredArgsConstructor
private static class WrappedString implements Comparable<WrappedString>, Supplier<String> {
@Override
public String get() {
return value;
}
@Override
public int compareTo(WrappedString o) {
final String s1 = get();
final String s2 = o.get();
return ComparisonChain.start()
.compare(s1.length(), s2.length())
.compare(s1, s2)
.result();
}
@NonNull private final String value;
}
public static Range<WrappedString> rangeOfWrappedStringsOfLength(int length) {
final char[] a = new char[length];
final WrappedString lower = new WrappedString(new String(a));
Arrays.fill(a, Character.MAX_VALUE);
final WrappedString upper = new WrappedString(new String(a));
return Ranges.closed(lower, upper);
}
ACharMatcher
はすでに述語であり、「宇宙」はすべての文字のセットであるため、マッチャーを a に変換するのは簡単Set
です。
private final static ImmutableSet<Character> allChars;
static {
final ImmutableSet.Builder<Character> builder = ImmutableSet.builder();
for (int i=Character.MIN_VALUE; i<=Character.MAX_VALUE; ++i) builder.add((char) i);
allChars = builder.build();
}
public static ImmutableSet<Character> toSet(CharMatcher matcher) {
return FluentIterable.from(allChars).filter(matcher).toImmutableSet();
}
しかし、私はそれが効率的であることを疑います。