如何仅使用 java 使用特殊字符(包括 space)创建大小为 5 的非重复随机字符串?
How to create non-repeating Random String of size 5 using special characters (including space) only using java?
我正在尝试仅使用特殊字符创建大小为 5 的字符串,例如 -
~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?
其中还包括 space。
下面是我试过的代码行:-
public static String randomSpecialCharacterString() {
char[] possibleCharacters = (new String("~`!@ # $ %^&*()-_=+[{]}\|;:\'\",<.>/?")).toCharArray();
String randomStr = RandomStringUtils.random( 5, 0, possibleCharacters.length-1, false, false, possibleCharacters, new SecureRandom());
return randomStr;
}
但是,它没有返回非重复字符串。而且,应该返回带有 space 的字符串。
例如 - @# ?/
和 !)( +
我已经检查了所有可能的重复项。
有 2 个错误:字符列表和计数值中缺少 space 个字符(...长度为 1 意味着永远不会选择列表中的最后一个字符)。
调用中的非重复字符串:
private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static Set<String> used = new HashSet<>();
private static final SecureRandom rand = new SecureRandom();
public static String randomSpecialCharacterString() {
String randomStr;
do {
randomStr = RandomStringUtils.random( 5, 0, possibleCharacters.length, false, false, possibleCharacters, rand);
} while(used.contains(randomStr));
used.add(randomStr);
return randomStr;
}
字符串中的非重复字符:
private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static final SecureRandom rand = new SecureRandom();
public static String randomSpecialCharacterString() {
final StringBuilder randomStr = new StringBuilder(5);
IntStream.range(0, 5).forEach(i -> {
String randomChar;
do {
randomChar = RandomStringUtils.random(1, 0, possibleCharacters.length, false, false, possibleCharacters, rand);
} while (randomStr.indexOf(randomChar) >= 0);
randomStr.append(randomChar);
});
int spacePosition = rand.nextInt(5);
return randomStr.replace(spacePosition, spacePosition + 1, " ").toString();
}
两者合并:
private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static Set<String> used = new HashSet<>();
private static final SecureRandom rand = new SecureRandom();
public static String randomSpecialCharacterString() {
String randomStr;
do {
randomStr = randomSpecialCharacterNonRepeatedString();
} while (used.contains(randomStr));
used.add(randomStr);
return randomStr;
}
public static String randomSpecialCharacterNonRepeatedString() {
final StringBuilder randomStr = new StringBuilder(5);
IntStream.range(0, 5).forEach(i -> {
String randomChar;
do {
randomChar = RandomStringUtils.random(1, 0, possibleCharacters.length, false, false, possibleCharacters,
new SecureRandom());
} while (randomStr.indexOf(randomChar) >= 0);
randomStr.append(randomChar);
});
int spacePosition = rand.nextInt(5);
return randomStr.replace(spacePosition, spacePosition + 1, " ").toString();
}
请注意此代码不是线程安全的。
假设 RESULT_STR_LENGTH
是 5:
如果你不想重复,只需随机化 possibleCharacters
:
的顺序
char[] shuffledCharacters = new char[possibleCharacters.length];
Collections.shuffle(Arrays.asList(possibleCharacters)).toArray(shuffledCharacters);
如果 space 必须在结果中,则用 space 替换随机字符(如果你不想重复 spaces,使确保 possibleCharacters
不包含任何 spaces):
shuffledCharacters[new Random().nextInt(RESULT_STR_LENGTH)] = ' ';
然后 return 前 RESULT_STR_LENGTH 个字符作为字符串:
return new String(shuffledCharacters, 0, RESULT_STR_LENGTH);
我正在尝试仅使用特殊字符创建大小为 5 的字符串,例如 -
~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?
其中还包括 space。
下面是我试过的代码行:-
public static String randomSpecialCharacterString() {
char[] possibleCharacters = (new String("~`!@ # $ %^&*()-_=+[{]}\|;:\'\",<.>/?")).toCharArray();
String randomStr = RandomStringUtils.random( 5, 0, possibleCharacters.length-1, false, false, possibleCharacters, new SecureRandom());
return randomStr;
}
但是,它没有返回非重复字符串。而且,应该返回带有 space 的字符串。
例如 - @# ?/
和 !)( +
我已经检查了所有可能的重复项。
有 2 个错误:字符列表和计数值中缺少 space 个字符(...长度为 1 意味着永远不会选择列表中的最后一个字符)。
调用中的非重复字符串:
private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static Set<String> used = new HashSet<>();
private static final SecureRandom rand = new SecureRandom();
public static String randomSpecialCharacterString() {
String randomStr;
do {
randomStr = RandomStringUtils.random( 5, 0, possibleCharacters.length, false, false, possibleCharacters, rand);
} while(used.contains(randomStr));
used.add(randomStr);
return randomStr;
}
字符串中的非重复字符:
private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static final SecureRandom rand = new SecureRandom();
public static String randomSpecialCharacterString() {
final StringBuilder randomStr = new StringBuilder(5);
IntStream.range(0, 5).forEach(i -> {
String randomChar;
do {
randomChar = RandomStringUtils.random(1, 0, possibleCharacters.length, false, false, possibleCharacters, rand);
} while (randomStr.indexOf(randomChar) >= 0);
randomStr.append(randomChar);
});
int spacePosition = rand.nextInt(5);
return randomStr.replace(spacePosition, spacePosition + 1, " ").toString();
}
两者合并:
private static final char[] possibleCharacters = "~`!@#$%^&*()-_=+[{]}\|;:\'\",<.>/?".toCharArray();
private static Set<String> used = new HashSet<>();
private static final SecureRandom rand = new SecureRandom();
public static String randomSpecialCharacterString() {
String randomStr;
do {
randomStr = randomSpecialCharacterNonRepeatedString();
} while (used.contains(randomStr));
used.add(randomStr);
return randomStr;
}
public static String randomSpecialCharacterNonRepeatedString() {
final StringBuilder randomStr = new StringBuilder(5);
IntStream.range(0, 5).forEach(i -> {
String randomChar;
do {
randomChar = RandomStringUtils.random(1, 0, possibleCharacters.length, false, false, possibleCharacters,
new SecureRandom());
} while (randomStr.indexOf(randomChar) >= 0);
randomStr.append(randomChar);
});
int spacePosition = rand.nextInt(5);
return randomStr.replace(spacePosition, spacePosition + 1, " ").toString();
}
请注意此代码不是线程安全的。
假设 RESULT_STR_LENGTH
是 5:
如果你不想重复,只需随机化
的顺序possibleCharacters
:char[] shuffledCharacters = new char[possibleCharacters.length]; Collections.shuffle(Arrays.asList(possibleCharacters)).toArray(shuffledCharacters);
如果 space 必须在结果中,则用 space 替换随机字符(如果你不想重复 spaces,使确保
possibleCharacters
不包含任何 spaces):shuffledCharacters[new Random().nextInt(RESULT_STR_LENGTH)] = ' ';
然后 return 前 RESULT_STR_LENGTH 个字符作为字符串:
return new String(shuffledCharacters, 0, RESULT_STR_LENGTH);