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

用于字符序列生成器的Java库,java,sequence-generators,Java,Sequence Generators,我需要生成递增的字符序列,其中每个字符可以是不同的字母或数字范围。有人知道有一个图书馆做这样的工作吗?例如: AAA000_A0 AAA000_A0++ = AAA000_A1 其中A是任意字母A-Z,0是任意数字0-9。我还需要增加它们,例如: AAA000_A0 AAA000_A0++ = AAA000_A1 如果你继续下去,它会像这样继续下去: AAA000_A9++ = AAA000_B0 直到达到: ZZZ999_Z9 这是一个简单的算法,一个短函数就足够了 下面是一个Ja

我需要生成递增的字符序列,其中每个字符可以是不同的字母或数字范围。有人知道有一个图书馆做这样的工作吗?例如:

AAA000_A0
AAA000_A0++ = AAA000_A1
其中A是任意字母A-Z,0是任意数字0-9。我还需要增加它们,例如:

AAA000_A0
AAA000_A0++ = AAA000_A1
如果你继续下去,它会像这样继续下去:

AAA000_A9++ = AAA000_B0
直到达到:

ZZZ999_Z9

这是一个简单的算法,一个短函数就足够了

下面是一个JavaScript示例,我将其组合在一起

var _LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var _NUMBERS = "0123456789";
function nextValue(str) {
    var result = "";
    var carry = true;
    var chr, idx, lookup;
    for(var i=str.length - 1; i>=0; i--) {
        chr = str.charAt(i);
        if(carry) {
            lookup = _LETTERS.indexOf(chr) >= 0 ? _LETTERS : (_NUMBERS.indexOf(chr) >= 0 ? _NUMBERS : "");
            idx = lookup.indexOf(chr);
            if(idx >= 0) {
                if(idx == lookup.length - 1) {
                    idx = 0;
                } else {
                    idx++;
                    carry = false;
                }
                chr = lookup.charAt(idx);
            }
        }
        result = chr + result;
    }
    return result;
}

var demo = "0_A";
while(demo != "9_Z") {
    demo = nextValue(demo);
    console.log(demo);
}

移植/转换为Java应该很简单,“indexOf”和“charAt”等函数名应该相同。

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

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();
            }
        }
    }
}
公共类计数器数字{
私人最终计数器数字更高;
私有最终字符串_字符;
私有int_指数=0;
公共计数器位数(计数器位数更高,字符串字符){
_更高=更高;
_chars=chars;
}
公共计数器位数(计数器位数较高,字符优先,字符最后){
这个(更高,charRange(第一个,最后一个));
}
私有静态字符串charRange(char first,char last){
StringBuilder b=新的StringBuilder();
for(char c=first;c=_chars.length()){
_指数=0;
如果(_更高!=null){
_更高。增量();
}
}
}
}
然后,您可以聚合以下各项的有序序列:

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();
    }
}
公共类计数器{
专用计数器位[]\u位;
公共计数器(字符串模板){
计数器位数最近=空;
_数字=新的计数器数字[template.length()];
对于(int i=0;i
我不知道是否有这方面的库,但这听起来像一个可爱的面试问题!:)JDK中没有这样的库可以生成可以按照您描述的方式定制的序列。不过,编写一个实现并不难。需要回答的一个重要问题是:生成器是否需要线程安全?@DilumRanatunga outsource by Journal?!我喜欢你的风格@KevinLawrence,我过去也这样做过——向可靠的候选人询问我正在解决的一个实际问题的变体。但在这种情况下,问题很容易解释,并要求应试者演示一些分解技巧等。我有点惊讶没有一个库用于此,似乎所有的东西都有一个库。我将对此进行修改,也许会使这些类型更易于扩展。干得好,非常感谢!我不需要JavaScript版本,但只要筛选一下就可以了+1.