`
jaystefanie
  • 浏览: 7943 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

从“001”到“ZZZ”

阅读更多
最近有个需求:一个3位数的字符串默认值从"001",判断与数据库的的无序数据是否重复,如果重复就加1,再验证,"999"之后第一位变为字母即"A00"开始,依此类推一直到"ZZZ"。如:"001"、"999"、"A00"、"A99"、"B00"、"Z99"、"ZA0"、"ZZZ"。
于是写了一个方法。然后想测试下这个方法,便出现了一下代码:
public class NextValueDemo {

	public static void main(String[] args) {
		test("001", 0);
	}
	
	public static void test(String value, int count){
		count++;
		if("ZZZ".equals(value)){
			System.out.println(count);
			return;
		}else{
			value = nextValue(value);
			test(value, count);
		}
	}
	
	public static String nextValue(String value){
		if("999".equals(value)){
			return "A00";
		}else if("Z99".equals(value)){
			return "ZA0";
		}else if("ZZ9".equals(value)){
			return "AAA";
		}else if("ZZZ".equals(value)){
			return "已到最大值";
		}
		char[] c = value.toCharArray();
		for(int i=c.length-1;i>=0;i--){
			if('9' == c[i]){
				c[i] = '0';
			}else if('Z' == c[i]){
				c[i] = 'A';
			}else{
				c[i]++;
				break;
			}
		}
		return String.valueOf(c);
	}
}


得到:3885(有误)

然后想看看具体生成了哪些:
public class NextValueDemo {

	public static void main(String[] args) {
		test("001", 0);
	}
	
	public static void test(String value, int count){
		count++;
		if("ZZZ".equals(value)){
			System.out.println(count);
			return;
		}else{
			value = nextValue(value);
			System.out.print(value + " ");
			if(count % 100 == 0){
				System.out.println();
			}
			test(value, count);
		}
	}
	
	public static String nextValue(String value){
		if("999".equals(value)){
			return "A00";
		}else if("Z99".equals(value)){
			return "ZA0";
		}else if("ZZ9".equals(value)){
			return "AAA";
		}else if("ZZZ".equals(value)){
			return "已到最大值";
		}
		char[] c = value.toCharArray();
		for(int i=c.length-1;i>=0;i--){
			if('9' == c[i]){
				c[i] = '0';
			}else if('Z' == c[i]){
				c[i] = 'A';
			}else{
				c[i]++;
				break;
			}
		}
		return String.valueOf(c);
	}
}


在打印到"ZC1"后 报出了个异常:
Exception in thread "main" java.lang.StackOverflowError
	at java.nio.Buffer.<init>(Unknown Source)
	at java.nio.CharBuffer.<init>(Unknown Source)
	at java.nio.HeapCharBuffer.<init>(Unknown Source)
	at java.nio.CharBuffer.wrap(Unknown Source)
	at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(Unknown Source)
	at sun.nio.cs.StreamEncoder.write(Unknown Source)
	at java.io.OutputStreamWriter.write(Unknown Source)
	at java.io.BufferedWriter.flushBuffer(Unknown Source)
	at java.io.PrintStream.write(Unknown Source)
	at java.io.PrintStream.print(Unknown Source)
	at org.zhuang.NextValueDemo.test(NextValueDemo.java:16)
	at org.zhuang.NextValueDemo.test(NextValueDemo.java:20)
	at org.zhuang.NextValueDemo.test(NextValueDemo.java:20)
        ......


嗯。栈溢出。

嗯。为什么呢?

补充:
又想了想 似乎和+1无关
于是又写了个这个:
public class Test {

	public static void main(String[] args) {
		test(0);
	}
	
	public static void test(int count){
		if(6930 == count){
			System.out.println("\r\n~~~~~~~~~~~" + count);
		}else{
			count++;
			test(count);
		}
	}

}


6930是极限 6931即报栈溢出
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics