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

Posted

技术标签:

【中文标题】用于字符序列生成器的 Java 库【英文标题】:Java library for character sequence generator 【发布时间】:2013-05-29 19:11:59 【问题描述】:

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

AAA000_A0

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

AAA000_A0++ = AAA000_A1

如果你继续下去,它会像这样延续:

AAA000_A9++ = AAA000_B0

直到到达:

ZZZ999_Z9

【问题讨论】:

我不知道是否有这个库,但这听起来像一个可爱的面试问题! :) JDK 中没有这样的库可以生成可以按照您描述的方式自定义的序列。不过,编写一个实现并不难。需要回答的一个重要问题是:生成器是否需要线程安全? @DilumRanatunga 通过面试外包?!我喜欢你的风格! @KevinLawrence,我过去曾这样做过——向可靠的候选人询问我正在解决的实际问题的变体。但在这种情况下,问题很容易解释,并要求候选人展示一些分解技能等。 【参考方案1】:

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

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

【讨论】:

我有点惊讶没有这个库,似乎所有东西都有一个库。我将解决这个问题,并可能使这些类型更具可扩展性。干得好,非常感谢!【参考方案2】:

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

这是我拼凑的一个 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”等函数名称应该相同。

【讨论】:

我不需要 JavaScript 版本,但只是筛选它看起来就可以完成这项工作。 +1

以上是关于用于字符序列生成器的 Java 库的主要内容,如果未能解决你的问题,请参考以下文章

如何反序列化包含 GSON 库生成的 LocalDate 字段的 JSON

怎样生成 java 序列化id

Java Gson 实现 Json 数据的生成与解析

管理休眠生成器序列

序列号生成器库

k-mer字符串的生成