java替换重复字符
因此,对于一个任务,我必须生成一个随机代码,并让某人在控制台中猜测代码。现在我的问题是,我似乎找不到一种方法来替换代码中的任何重复字符。代码的范围必须为“ABCDEF”,并包含4个字母。到目前为止,我得到的是:java替换重复字符,java,string,duplicates,Java,String,Duplicates,因此,对于一个任务,我必须生成一个随机代码,并让某人在控制台中猜测代码。现在我的问题是,我似乎找不到一种方法来替换代码中的任何重复字符。代码的范围必须为“ABCDEF”,并包含4个字母。到目前为止,我得到的是: char codeLetters; String masterCode; StringBuilder strings = new StringBuilder(); Random random = new Random(); for (int i
char codeLetters;
String masterCode;
StringBuilder strings = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 4; i++) {
codeLetters = code[random.nextInt(code.length)];
strings.append(codeLetters);
}
masterCode = strings.toString();
String temp = "";
boolean isDuplicate = false;
for (int i = 0; i < masterCode.length(); i++) {
isDuplicate = false;
char comparisonChar = masterCode.charAt(i);
for (int j = i + 1; j < masterCode.length(); j++) {
char nextChar = masterCode.charAt(j);
if (comparisonChar == nextChar) isDuplicate = true;
}
if (!isDuplicate) temp = temp + comparisonChar;
}
masterCode = temp;
System.out.println(masterCode);
char代码字母;
字符串主代码;
StringBuilder字符串=新的StringBuilder();
随机=新随机();
对于(int i=0;i<4;i++){
codeLetters=code[random.nextInt(code.length)];
字符串。追加(代码字母);
}
masterCode=strings.toString();
字符串temp=“”;
布尔值isDuplicate=false;
对于(int i=0;i
它要么打印由2-3个字母组成的代码,要么打印包含5或6个字母的代码,很少打印包含4个字母的正确代码。据我所知,这段代码所做的不是添加重复的字符,而是用另一个字符替换它们。有没有办法用另一个随机生成的字符替换这些字符,而不使用集合,而该字符还不在字符串中?听起来您只想在
code
中使用每个字母一次?为什么不从一开始就使用ArrayList
进行设置,并删除随机选择的每个字符:
// copy `code` into a temporary arraylist
ArrayList<Character> possibleLetters = new ArrayList<Character>(code.length);
for (char c : code) possibleLetters.add(c);
// select randomly "without replacement"
for (int i = 0; i < 4; i++) {
int index = random.nextInt(possibleLetters.size());
codeLetters = possibleLetters.remove(index);
strings.append(codeLetters);
}
//将'code'复制到临时数组列表中
ArrayList possibleLetters=新的ArrayList(code.length);
对于(字符c:代码)可能的标识符。添加(c);
//随机选择“无需更换”
对于(int i=0;i<4;i++){
int index=random.nextInt(possibleLetters.size());
codeLetters=possibleLetters.remove(索引);
字符串。追加(代码字母);
}
听起来好像你只想在code
中使用每个字母一次?为什么不从一开始就使用ArrayList
进行设置,并删除随机选择的每个字符:
// copy `code` into a temporary arraylist
ArrayList<Character> possibleLetters = new ArrayList<Character>(code.length);
for (char c : code) possibleLetters.add(c);
// select randomly "without replacement"
for (int i = 0; i < 4; i++) {
int index = random.nextInt(possibleLetters.size());
codeLetters = possibleLetters.remove(index);
strings.append(codeLetters);
}
//将'code'复制到临时数组列表中
ArrayList possibleLetters=新的ArrayList(code.length);
对于(字符c:代码)可能的标识符。添加(c);
//随机选择“无需更换”
对于(int i=0;i<4;i++){
int index=random.nextInt(possibleLetters.size());
codeLetters=possibleLetters.remove(索引);
字符串。追加(代码字母);
}
导入java.util.Random;
公共班机{
私有静态字符[]代码=新字符[]{'A','B','C','D','E','F'};
公共静态最终void main(字符串[]args){
字符编码字母;
字符串主代码;
StringBuilder字符串=新的StringBuilder();
随机=新随机();
while(strings.length()<4){
char tmpcode=code[random.nextInt(code.length)];
if(strings.toString()包含(tmpcode+“”)){
继续;
}
代码字母=tmpcode;
字符串。追加(代码字母);
}
masterCode=strings.toString();
System.out.println(主代码);
}
}
用这个替换for循环,之后就不需要进行任何替换。
这将只插入字符串中尚未包含的字符。import java.util.Random;
公共班机{
私有静态字符[]代码=新字符[]{'A','B','C','D','E','F'};
公共静态最终void main(字符串[]args){
字符编码字母;
字符串主代码;
StringBuilder字符串=新的StringBuilder();
随机=新随机();
while(strings.length()<4){
char tmpcode=code[random.nextInt(code.length)];
if(strings.toString()包含(tmpcode+“”)){
继续;
}
代码字母=tmpcode;
字符串。追加(代码字母);
}
masterCode=strings.toString();
System.out.println(主代码);
}
}
用这个替换for循环,之后就不需要进行任何替换。
这将只插入字符串中尚未包含的字符。您是否查看过
string#replace
或string#replaceAll
?在检测到重复后用另一个随机生成的字符替换可能不是您想要的方式。虽然不太可能,但从理论上讲,它可能永远不会终止——而且完成一项简单的任务肯定会花费很长时间。我会考虑改变你的逻辑,如何做到这一点,如果你真的想随机选择4从6的任何顺序。下面来自@AndyBrown的答案显示了一种方法()我在这里查阅了很多关于StackOverflow的问题,但现在我发现我一直在用错误的方式看待它。我试过String#replace和String#replaceAll,但结果大多是只替换了后续的重复项,或者用另一个重复的字符替换。您是否看过String#replace
或String#replaceAll
?在检测到重复后用另一个随机生成的字符替换可能不是您想要的方式。虽然不太可能,但从理论上讲,它可能永远不会终止——而且完成一项简单的任务肯定会花费很长时间。我会考虑改变你的逻辑,如何做到这一点,如果你真的想随机选择4从6的任何顺序。下面来自@AndyBrown的答案显示了一种方法()我在这里查阅了很多关于StackOverflow的问题,但现在我发现我一直在用错误的方式看待它。我尝试了String#replace和String#replaceAll,但结果大多是只替换了后面的重复项