Java字符序列生成器的库

5

我需要生成递增的字符序列,其中每个字符可以属于不同的字母或数字范围。有没有人知道一个库可以完成这样的任务?例如:

AAA000_A0

其中A代表任意字母 A-Z,0代表任意数字 0-9。我还需要对它们进行递增,例如:

AAA000_A0++ = AAA000_A1

如果你继续进行,它会像这样延续:

AAA000_A9++ = AAA000_B0

直到它达到:

ZZZ999_Z9

1
我不知道是否有这方面的库,但这听起来像是一个有趣的面试问题! :) - Dilum Ranatunga
1
JDK中没有这样的库可以生成可以按照您描述的方式进行自定义的序列。不过编写一个实现并不是非常困难。需要回答的一个重要问题是:生成器是否需要线程安全? - scottb
@DilumRanatunga 通过面试外包?!我喜欢你的风格! - Kevin Lawrence
@KevinLawrence,我以前做过这件事——向优秀的候选人提出我正在解决的实际问题的变体。但在这种情况下,问题很容易解释,并要求候选人展示一些分解技能等。 - Dilum Ranatunga
2个回答

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();
            }
        }
    }
}

您可以聚合这些排序后的序列:
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();
    }
}

我有点惊讶这方面没有库,因为似乎什么都有库。我会试着搞一下,也许让类型更加可扩展。干得好,非常感谢! - Kevin Lawrence

1

这是一个简单的算法,编写一个短小的函数就足够了,不需要使用库。

下面是我用 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);
}

您应该很容易地将函数名称如“indexOf”和“charAt”转换为Java,名称应保持不变。


我不需要JavaScript版本,但是简单浏览它的代码看起来似乎可以完成这个任务。+1 - Kevin Lawrence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接