当前位置: 代码迷 >> Android >> 请帮看看,有上面的方法产生一个随机字符,为什么第二次调用时就会死了
  详细解决方案

请帮看看,有上面的方法产生一个随机字符,为什么第二次调用时就会死了

热度:6   发布时间:2016-05-01 13:15:45.0
请帮看看,有下面的方法产生一个随机字符,为什么第二次调用时就会死了?
想附机的产生一个字符(的串),如“A” 或“w”,但要调用多次,且为了避免重复,加了个排除strExclude,如果得到的字串在此字符串内存在,就再生成一个,直到不在strExclude串中:

  private String GetRandomCharString(String strExclude){
  Random randGen = null;
  char[] numbersAndLetters = null;

  if (randGen == null) 
  {
  randGen = new Random();
  numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
  }
  char randC;
  String randStr="";
  while(strExclude.indexOf(randStr)>0){
  randC = numbersAndLetters[randGen.nextInt(61)];
  randStr=String.valueOf(randC);
  }
  return randStr;
  }

------解决方案--------------------
把while部分换成do...while就好了,你现在的写法,while循环是永远也不会执行的.
下面是代码.

Java code
public static String GetRandomCharString(String strExclude) {        Random randGen = null;        char[] numbersAndLetters = null;        if (randGen == null) {            randGen = new Random();            numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")                    .toCharArray();        }        char randC;        String randStr = "";        do {            randC = numbersAndLetters[randGen.nextInt(61)];            randStr = String.valueOf(randC);        } while (strExclude.indexOf(randStr) > 0);        return randStr;    }
------解决方案--------------------
这个方法里没有必要声明那么多变量,可以把Random和字符数组声明在方法外进行缓存,不用每次都创建一个新对象,我帮你重新改了一下代码,你可以参考一下.

Java code
import java.util.Random;public class Demo {        public static void main(String[] args) {        String str = "";        for(int i = 0; i < 15; i++) {            str += GetRandomCharString(str);        }        System.out.println(str);    }    private static Random randGen = new Random();;    private static char[] numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")            .toCharArray();    public static String GetRandomCharString(String strExclude) {        char randC;        do {            randC = numbersAndLetters[randGen.nextInt(61)];        } while (strExclude.indexOf(randC) > 0);        return String.valueOf(randC);    }}
------解决方案--------------------
这里边存在死循环的可能性,如果你所要的随机字符串长度大于numbersAndLetters数组的长度就会出现死循环,所以要在while加一个条件

Java code
while (strExclude.indexOf(randC) > 0 && [color=#FF0000]strExclude.length < numbersAndLetters.length[/color]);
------解决方案--------------------
在进入while循环之前应该要先执行:
randC = numbersAndLetters[randGen.nextInt(61)];
randStr=String.valueOf(randC);
这两句吧,否则randStr不是一直为空串么?
  相关解决方案