生成具有严格限制的随机字符串的算法 - Java

时间:2016-01-02 15:16:14

标签: java regex string random

我试图让程序为用户生成一个随机帐户名。用户将点击一个按钮,它会将帐户名称复制到他的剪贴板。它的GUI部分正在工作,但我无法想到处理随机生成字符串的最佳方法。

用户名中的允许字符:A-Z a-z _

不能出现数字,没有其他符号,也不能连续出现两个相同的字符。

必须是六岁。

我的想法:

create an array of characters:

[ _, a, b, c, d ... etc ]

Generate a random integer between 0 and array.length - 1
 and pick the letter in that slot.

Check the last character to be added into the output String, 
and if it's the same as the one we just picked, pick again.

Otherwise, add it to the end of our String.

Stop if the String length is of length six.

有更好的方法吗?也许正则表达式?我有一种感觉,我想在这里做这件事的方式非常糟糕。

1 个答案:

答案 0 :(得分:3)

我没有看到你提出的算法有什么问题(除了你需要处理你添加的第一个字符而不检查你是否已经添加它)。您也可以将其提取为static方法并使用Random之类的

static Random rand = new Random();

static String getPassword(String alphabet, int len) {
  StringBuilder sb = new StringBuilder(len);
  while (sb.length() < len) {
    char ch = alphabet.charAt(rand.nextInt(alphabet.length()));
    if (sb.length() > 0) {
      if (sb.charAt(sb.length() - 1) != ch) {
        sb.append(ch);
      }
    } else {
      sb.append(ch);
    }
  }
  return sb.toString();
}

然后你可以用类似的东西来调用它,

public static void main(String[] args) {
  StringBuilder alphabet = new StringBuilder();
  for (char ch = 'a'; ch <= 'z'; ch++) {
    alphabet.append(ch);
  }
  alphabet.append(alphabet.toString().toUpperCase()).append('_');
  String pass = getPassword(alphabet.toString(), 6);
  System.out.println(pass);
}