2016-04-03 70 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」的方法相比。 –