3

Guava には、個別のドメインにわたって範囲を定義し、それらの数値を表すコレクションを作成する機能があります。

現代英語のラテン文字の範囲を作成することは可能ですか?

たぶん、これはそれが不可能であることを示唆していますが、私は彼らの個別のドメインの定義を本当に理解していません:

離散ドメインは、常にそのタイプの値のセット全体を表します。「素数」、「長さ 5 の文字列」、「真夜中のタイムスタンプ」などの部分ドメインを表すことはできません。

長さ 5 の文字列はすべて離散集合ではありませんか? 可能性のあるすべてのラテン文字のセットは、個別のドメインの定義ではないでしょうか?

4

3 に答える 3

4

あなたは本当にRangeあなたのコードにを必要としますか?

CharMatcherおそらくあなたは?を使うことができます 閉じた範囲のみをサポートし、操作のセット(および、または否定)が制限されていますが、これで十分な場合は、適切な代替手段になる可能性があります。

于 2012-08-17T13:58:21.087 に答える
3

Guava Ranges は連続している必要があるため、単一の Range を使用できない場合がありますが、複数の Range オブジェクトを作成し、それらのセット表現を組み合わせて、範囲内の値のコレクションを取得することはできます。

DiscreteDomain<Character> domain = new DiscreteDomain<Character>(){
  // Implement DiscreteDomain for Character type
};

Range<Character> lower = Ranges.closed('a','z');
Range<Character> upper = Ranges.closed('A','Z');

HashSet<Character> set = new HashSet<Character>();
set.addAll(lower.asSet(domain));
set.addAll(upper.asSet(domain));
于 2012-08-17T15:14:55.463 に答える
1

実際には、すべてが可能ですが、意味がない場合があります。「長さ 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();
}

しかし、私はそれが効率的であることを疑います。

于 2012-08-17T16:38:05.063 に答える