用于字符序列生成器的Java库

Kev*_*nce 5 java sequence-generators

我需要生成递增的字符序列,其中每个字符可以是不同的字母或数字范围.有谁知道这个任务的图书馆?例如:

AAA000_A0
Run Code Online (Sandbox Code Playgroud)

A是任何字母AZ,0是任意数字0-9.我也需要增加它们,例如:

AAA000_A0++ = AAA000_A1
Run Code Online (Sandbox Code Playgroud)

如果你坚持下去,它将继续这样:

AAA000_A9++ = AAA000_B0
Run Code Online (Sandbox Code Playgroud)

直到达到:

ZZZ999_Z9
Run Code Online (Sandbox Code Playgroud)

Dil*_*nga 3

我会将问题分解为每个点,有点像汽车的里程表:

public class CounterDigit {
    private final CounterDigit _higher;
    private final String _chars;
    private int _index = 0;

    public CounterDigit(CounterDigit higher, String chars) {
        _higher = higher;
        _chars = chars;
    }

    public CounterDigit(CounterDigit higher, char first, char last) {
        this(higher, charRange(first, last));
    }

    private static String charRange(char first, char last) {
        StringBuilder b = new StringBuilder();
        for (char c = first; c <= last; ++c) {
            b.append(c);
        }
        return b.toString();
    }

    public char current() {
        return _chars.charAt(_index);
    }

    public void increment() {
        if (++_index >= _chars.length()) {
            _index = 0;
            if (_higher != null) {
                _higher.increment();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以聚合这些的有序序列:

public class Counter {
    private CounterDigit[] _digits;

    public Counter(String template) {
        CounterDigit recent = null;
        _digits = new CounterDigit[template.length()];
        for (int i = 0; i < template.length(); ++i) {
            char c = template.charAt(i);
            if      (c == 'A') { recent = new CounterDigit(recent, 'A', 'Z'); }
            else if (c == '0') { recent = new CounterDigit(recent, '0', '9'); }
            else               { recent = new CounterDigit(recent, c, c);     }
            _digits[i] = recent;
        }
    }

    public void increment() {
        _digits[_digits.length-1].increment();
    }

    @Override
    public String toString() {
        StringBuilder b = new StringBuilder(_digits.length);
        for (CounterDigit digit : _digits) {
            b.append(digit.current());
        }
        return b.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)