java怎么生成字母_在Java中生成字母序列
我的版本實(shí)現(xiàn)了Iterator并且保持一個(gè)int計(jì)數(shù)器.計(jì)數(shù)器值轉(zhuǎn)換為相應(yīng)的字符串:
import com.google.common.collect.AbstractIterator;
class Sequence extends AbstractIterator {
private int now;
private static char[] vs;
static {
vs = new char['Z' - 'A' + 1];
for(char i='A'; i<='Z';i++) vs[i - 'A'] = i;
}
private StringBuilder alpha(int i){
assert i > 0;
char r = vs[--i % vs.length];
int n = i / vs.length;
return n == 0 ? new StringBuilder().append(r) : alpha(n).append(r);
}
@Override protected String computeNext() {
return alpha(++now).toString();
}
}
在Iterator上調(diào)用next()來使用它.
Sequence sequence = new Sequence();
for(int i=0;i<100;i++){
System.out.print(sequence.next() + " ");
}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE
較大序列具有更好性能的實(shí)現(xiàn)會重復(fù)使用公共前綴:
class SequencePrefix extends AbstractIterator {
private int now = -1;
private String prefix = "";
private static char[] vs;
static {
vs = new char['Z' - 'A' + 1];
for(char i='A'; i<='Z';i++) vs[i - 'A'] = i;
}
private String fixPrefix(String prefix){
if(prefix.length() == 0) return Character.toString(vs[0]);
int last = prefix.length() - 1;
char next = (char) (prefix.charAt(last) + 1);
String sprefix = prefix.substring(0, last);
return next - vs[0] == vs.length ?
fixPrefix(sprefix) + vs[0] : sprefix + next;
}
@Override protected String computeNext() {
if(++now == vs.length) prefix = fixPrefix(prefix);
now %= vs.length;
return new StringBuilder().append(prefix).append(vs[now]).toString();
}
}
如果您使用與數(shù)組一起使用的實(shí)現(xiàn)來重寫此基本算法,那么您將獲得更好的性能. (String.charAt,String.substring和StringBuffer有一些開銷)
總結(jié)
以上是生活随笔為你收集整理的java怎么生成字母_在Java中生成字母序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java能传地址吗,详解java的值传递
- 下一篇: oracle 布尔转换java布尔_ja