Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有严格限制的随机字符串生成算法-Java_Java_Regex_String_Random - Fatal编程技术网

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

具有严格限制的随机字符串生成算法-Java,java,regex,string,random,Java,Regex,String,Random,我正在尝试制作一个程序,为用户生成一个随机帐户名。用户将点击一个按钮,它将把帐户名复制到他的剪贴板上。它的GUI部分正在工作,但我想不出处理随机生成字符串的最佳方法 用户名中允许的字符:A-Z A-Z\u 一行中不能出现数字、其他符号和两个相同字符 长度必须为6 我的想法是: create an array of characters: [ _, a, b, c, d ... etc ] Generate a random integer between 0 and array.length

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

用户名中允许的字符:A-Z A-Z\u

一行中不能出现数字、其他符号和两个相同字符

长度必须为6

我的想法是:

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.

有更好的办法吗?也许用正则表达式?我有一种感觉,我在这里想的方法真的很糟糕。

我看不出你提出的算法有任何问题(除了你需要处理你添加的第一个字符,而不检查你是否已经添加了它)。您还可以将其提取到
静态
方法中,并使用
随机
方法

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();
}
static Random rand=new Random();
静态字符串getPassword(字符串字母表,整数长度){
StringBuilder sb=新StringBuilder(len);
while(某人的长度){
char ch=alphabet.charAt(rand.nextInt(alphabet.length());
如果(sb.length()>0){
if(sb.charAt(sb.length()-1)!=ch){
某人附加(ch);
}
}否则{
某人附加(ch);
}
}
使某人返回字符串();
}
然后你可以这样称呼它

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);
}
publicstaticvoidmain(字符串[]args){
StringBuilder字母表=新的StringBuilder();

对于(char ch='a';ch只是为了澄清,
a_a_a_
很好吗?你为什么需要一个更好的方法?你的想法有什么问题?很简单,它符合你的要求-只需编写代码。请注意,你可能忘记了一个重要的约束:你不能有两个同名的用户,是吗?你为什么不让用户选择他们自己的名字他们不能再注册吗?为忘记帐户名的用户的不断请求做好准备。使用Stringbuilder的好主意。我忘记了它的存在。谢谢!