2013-12-14 48 views
3

什麼是最簡單的方法來洗牌數組中的單詞的字母?我在一個數組中有一些單詞,我隨機選擇一個單詞,但我也想洗牌。我該如何洗牌一個字的字母?

public static void main (String[] args) { 
    String [] animals = { "Dog" , "Cat" , "Dino" } ;  
    Random random = new Random(); 
    String word = animals [random.nextInt(animals.length)]; 

    System.out.println (word) ; 
    //I Simply want to shuffle the letters of word  
} 

我不應該使用那個List事物。我已經想出了這樣的東西,但是用這個代碼打印隨機字母它不會洗牌。也許我可以編寫類似不打印的內容,如果這封信已經打印出來的話?

//GET RANDOM LETTER 
for (int i = 0; i< word.length(); i++) { 

char c = (word.charAt(random.nextInt(word.length()))); 
System.out.print(c); } 
    } 
+0

顯示UW您已經嘗試什麼:)的 –

+0

可能重複[如何洗牌字符串中的字符(HTTP:/ /stackoverflow.com/questions/3316674/how-to-shuffle-characters-in-a-string) –

+0

我已經訪問過它使用列表的頁面,我無法使用它。 – morgothraud

回答

7

真的沒有必要收集和什麼比什麼更如下:

public static void main(String[] args) { 

    // Create a random object 
    Random r = new Random(); 

    String word = "Animals"; 

    System.out.println("Before: " + word); 
    word = scramble(r, word); 
    System.out.println("After : " + word); 
} 

public static String scramble(Random random, String inputString) 
{ 
    // Convert your string into a simple char array: 
    char a[] = inputString.toCharArray(); 

    // Scramble the letters using the standard Fisher-Yates shuffle, 
    for(int i=0 ; i<a.length ; i++) 
    { 
     int j = random.nextInt(a.length); 
     // Swap letters 
     char temp = a[i]; a[i] = a[j]; a[j] = temp; 
    }  

    return new String(a); 
} 
+1

爲什麼在條件是<<而不是使用'a.length'時使用'a.length-1'。當限制到' macskay

+0

我編輯了算法,也根據我自己的測試和@ mkli90的評論來混洗最後一個字符。 –

3

您可以使用Collections.shuffle

List<Character> l = new ArrayList<>(); 
for(char c : word.toCharArray()) //for each char of the word selectionned, put it in a list 
    l.add(c); 
Collections.shuffle(l); //shuffle the list 

StringBuilder sb = new StringBuilder(); //now rebuild the word 
for(char c : l) 
    sb.append(c); 

word = sb.toString(); 

我不應該使用該名單的事情。

然後,您可以創建兩個StringBuilder對象。一個持有原始的詞和一個將創建整理的一個:

StringBuilder s = new StringBuilder(word); 
StringBuilder wordShuffled = new StringBuilder(); 
while(s.length() != 0){ 
    int index = random.nextInt(s.length()); 
    char c = s.charAt(index); 
    wordShuffled.append(c); 
    s.deleteCharAt(index); 
} 
System.out.println(wordShuffled.toString()); 

我發現像deleteCharAt,但我想它的工作原理與 的StringBuilder類的東西。我不能用

Here你可以找到一些不錯的工具方法,允許洗牌數組。

public static char[] shuffleArray(char[] x) {  
     for (int i = x.length; i > 0; i--) { 
      int rand = (int)(Math.random()*(i)); 
      char temp = x[i-1]; 
      x[i-1] = x[rand]; 
      x[rand] = temp; 
     } 
     return x; 
} 

然後,只需調用此方法,並使用構造String(char[] value)

System.out.println(new String(shuffleArray(word.toCharArray()))); 

下一次明確規定,你可以使用/不能使用。

0

這樣的事情呢?

// Shuffle an array of characters. 
public static void shuffleArray(char[] a) { 
    int n = a.length; // the length of the array. 
    for (int i = 0; i < n; i++) { 
    int t = random.nextInt(n); // pick a random number 0 - the length. 
    if (t == i) {    // if the random number is the loop counter 
     if (i > 0) {    // check if we're at the first element. 
     t = random.nextInt(i); // pick another number between 0 - and the loop counter. 
     } else { 
     t = a.length - 1;  // the end of the loop. 
     } 
    } 
    a[i] ^= a[t];    // swap a[i] and a[t] 
    a[t] ^= a[i]; 
    a[i] ^= a[t]; 
    } 
} 

private static Random random = new Random(); // the shared random. 

public static void main(String[] args) { 
    String[] animals = { "Dog", "Cat", "Dino" }; 
    String word = animals[random 
     .nextInt(animals.length)]; 

    System.out.println(word);   // the random word. 
    char[] arr = word.toCharArray();  // the char[] from the word. 
    shuffleArray(arr);     // shuffle it. 
    System.out.println(new String(arr)); // print it. 
} 
+0

這是我想要的,但請你解釋交換部分,因爲我沒有ide^^是什麼,爲什麼我們交換了3次。 @Elliott Frisch – morgothraud

+0

這是XOR交換。 HTTP:// EN。wikipedia.org/wiki/XOR_swap_algorithm – RobAu

相關問題