2014-03-27 160 views
-1

我不得不嘗試洗牌數組的值並返回它們的問題。我必須詢問用戶是否想要使用循環進行隨機播放,如果用戶回答「y」,則在回答爲「n」時顯示隨機數值,然後離開循環。我將不勝感激任何幫助。陣列洗牌java

這是我到目前爲止。

主要類

package lab4b; 

import java.util.Scanner; 

public class Lab4B 
{ 

    public static void main(String[] args) 
    { 
     final int size = 15; 
     char q = 'y'; 
     boolean flag = false; 

     Shuffler myShuffler = new Shuffler(size); 

     myShuffler.display(); 
     System.out.println(); 

     Scanner input = new Scanner(System.in); 
     System.out.printf("Do you wish to shuffle this numbers? "); 
     String input2 = input.next(); 


     myShuffler.shuffle(); 
     myShuffler.display(); 
     System.out.printf("Do you wish to shuffle this numbers? "); 

     input.close(); 


    } 
} 

洗牌類

package lab4b; 

import java.util.Random; 

public class Shuffler 
{ 

    private int[] data; 

    public Shuffler(int size) 
    { 
     data = new int[size]; 

     for (int i = 0; i < size; i++) 
     { 
      data[i] = i + 1; 
     } 

    } 

    public void shuffle() 
    { 


     for (int i = 0; i < data.length; i++) 
     { 
      Random r = new Random(15); 

      int second = r.nextInt(15) + 1; 
      int temp = data[i]; 
      data[i] = data[second]; 
      data[second] = temp; 
     } 

    } 

    public void display() 
    { 

     String values = ""; 

     for (int i = 0; i < data.length; i++) 
     { 
      if (i < 15) 
      { 
       values += (i + 1); 
       if (i < 14) 
       { 
        values += ", "; 
       } 
      } 
     } 
     System.out.printf("Array Contents: %s \n", values); 


    } 
} 
+0

什麼是_exact_問題? – Thomas

+0

你的問題是什麼? –

+0

'......走出循環......'除了洗牌機中的循環之外,我沒有看到任何循環,這可能不是你的意思。 – Thomas

回答

2

我不知道你爲什麼會自己編寫代碼的隨機邏輯。 Java Collections具有內置Shuffle:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle(java.util.List)。還有一個需要Random:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle(java.util.List,java.util.Random)

將數組轉換爲List,讓Collections將其拖動到列表中,然後將列表重新轉換爲數組。

+0

不需要將列表返回到數組。只需使用Arrays.asList()將數組包裝到列表中,將列表進行洗牌,然後將數組進行洗牌。 –

0

下面是可能失敗的一部分:

for (int i = 0; i < data.length; i++) 
{ 
    Random r = new Random(15); 

    int second = r.nextInt(15) + 1; 
    int temp = data[i]; 
    data[i] = data[second]; 
    data[second] = temp; 
} 

你在範圍內創建第二個指標[1,15]但是,如果data陣列是較小或較大?如果更小,如果更大,則會得到IndexOutOfBoundsException,您總是將當前元素與索引1至15中的元素交換。

在該部分中,您列出的是索引而不是值,最多隻有15個他們:

if (i < 15) //what if data was bigger than 15 elements? 
{ 
    values += (i + 1); //you might want to use data[i] instead of (1 + 1) here. 
    if (i < 14) 
    { 
    values += ", "; 
    } 
} 
+0

好的謝謝你的回覆,但也許我不是很清楚。我的數組包含值1 ... 15.我必須顯示這些值才能請求用戶隨機播放。這是一個輸出示例。數組包含:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15是否希望對這些數字進行洗牌? y數組包含:5 12 7 10 6 9 15 1 13 3 4 11 14 2 8如果用戶輸入n退出循環。 – PedroIt

+0

@Pedro這個數組包含的值是多少有些不相關的,問題在於你混合了值和索引以及動態和硬編碼的數組長度,這很可能會產生錯誤。 – Thomas