用于字符序列生成器的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.