2015-01-16 70 views
1

因此,对于任务我必须生成一个随机代码,并有人猜测控制台中的代码。现在我的问题是,我似乎无法找到一种方法来替换代码中的任何重复字符。代码必须在“ABCDEF”范围内,并且包含4个字母。这是我走到这一步:java替换重复字符

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); 

它打印要么由出2-3个字母代码,或含5个或6个字母的字符,且很少与4个字母一个正确的代码。据我所知,这段代码所做的不是添加重复字符,而是我希望它将它们替换为另一个字符。有没有办法用另一个随机生成的字符来替换字符,而不使用集合呢?

+0

你看过'String#replace'或'String#replaceAll'吗? – Ascalonian

+0

检测到重复项后用另一个随机生成的char替换可能不是您想要的方式。尽管不太可能,但理论上它可能永远不会终止 - 而且可能需要很长时间才能完成一项简单的任务。我会考虑改变你的逻辑,如果你真的想从任意顺序的6中随机选择4。从@AndyBrown下面的答案显示了一种方法来做到这一点(http://stackoverflow.com/a/27987066/838992) –

+0

我在StackOverflow查找了很多问题,但现在我看到我一直在寻找一直以来都是错误的。我试过String#replace和String#replaceAll,但是它大多只会替换彼此相关的重复项,或者用另一个重复项替换它。 – Arrrow

回答

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); 
} 
+0

是的,不一定取代它们。非常感谢! – Arrrow

0
import java.util.Random; 

public class Main { 

    private static char[] code = new char[] { 'A', 'B', 'C', 'D', 'E', 'F'}; 

    public static final void main(String[] args) { 
     char codeLetters; 
     String masterCode; 
     StringBuilder strings = new StringBuilder(); 
     Random random = new Random(); 

     while (strings.length() < 4) { 
      char tmpcode = code[random.nextInt(code.length)]; 
      if (strings.toString().contains(tmpcode + "")) { 
       continue; 
      } 
      codeLetters = tmpcode; 
      strings.append(codeLetters); 
     } 
     masterCode = strings.toString(); 
     System.out.println(masterCode); 
    } 
} 

更换你的for循环与这一个,那么你并不需要之后做任何替换。 这只会插入字符串中尚不存在的字符。

+0

尽管这会花费很长时间,但如果random.nextInt真的是随机的,它可能需要很长时间(或理论上永远不会结束)。考虑一下,如果random.nextInt不断返回已经使用过的索引。这个例子没关系 - 但总的来说(比如我们需要从100个随机顺序中选择99个非重复项),这可能是非常低效的。 –

+0

是的,我刚才看到安迪的帖子后才意识到。的xD – Joe