2016-04-03 65 views
0
Random random = new Random(); 
String randomLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
for (int n=0; n<=25; n++) 
System.out.print(randomLetters.charAt(random.nextInt(randomLetters.length()))); 

当打印随机26个字母有重复的字母,我想打印随机26个字母不打印重复的字母Java标准_Question

这一结果显示我

FXNJZMQWFTSKLRRFHOYWGTIQPWBUILD 
+3

那么你不需要随机字母你呢? (你需要''洗牌'包含26个字母的'List') –

回答

3

由于只有26个字母,我假设你只是想要随机顺序的大写字母。要做到这一点,你应该使用Collections.shuffle()方法。这样做的一个方法:

List<Character> letters = new ArrayList<>(); 
for (char letter = 'A'; letter <= 'Z'; letter++) { 
    letters.add(letter); 
} 
Collections.shuffle(letters); 
letters.forEach(System.out::print); 

需要注意的是,如果你不使用Java 8中,最后一行不会因为它使用forEach()和编译method reference - 在Java 7中的等效回路将如下所示:

for (Character letter : letters) { 
    System.out.print(letter); 
} 

(它也是有效的用在这里char,但我回避了一些自动拆箱可能没什么区别)

0

要打印唯一的字符,我会采取号码列表从0到26,洗牌,然后打印通过迭代它,例如:

List<Integer> numbers = new ArrayList<Integer>(); 
for(int i = 0 ; i < 26 ; i++){ 
    numbers.add(i); 
} 
Collections.shuffle(numbers); 
String randomLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
for(int index = 0 ; index < numbers.size() ; index++){ 
    System.out.print(randomLetters.charAt(numbers.get(index))); 
} 
0

您需要删除刚刚从字符串中选择的索引。因此,如果您将该字符串更改为stringbuilder,则可以使用函数deleteCharAt(index)。

希望有所帮助。

1

你可以使用StringBuilder删除打印每次信这样你就不会再次打印

Random random = new Random(); 
String randomLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
for (int n=25; n>=0; n--){ 
    StringBuilder sb = new StringBuilder(randomLetters); 
    int index = random.nextInt(randomLetters.length()); 
    char c = randomLetters.charAt(index); 
    System.out.print(c); 
    sb.deleteCharAt(index); 
    randomLetters = sb.toString(); 
    } 
+0

我不会在每次迭代中创建一个'新的StringBuilder'。另外,不要忘记数组中的删除操作是'O(n)'操作;使这个'O(n^2)' - 一个非常不合格的解决方案;特别是与基于“shuffle”的方法相比。 –