2014-09-03 73 views
0

我正在嘗試創建一個彩票號碼生成器。它會詢問用戶他們想玩多少遊戲,然後創建一個隨機挑選的數字1-49的彩票。每場比賽將被儲存。一旦所有遊戲創建完成後,它將打印出來。現在我遇到了一個問題,遊戲並沒有按照我想要的方式複製到ArrayList中。目前它將它們全部放入元素中,然後複製該元素「numberOfGames」次。我很確定它與for循環有關,但是我被困在這一部分。ArrayList彩票遊戲

public class LotteryTicket { 

ArrayList<Integer> Numbers; 
ArrayList<Integer> Lottery; 
ArrayList<ArrayList<Integer>> Games; 


LotteryTicket(){ 
    Lottery = new ArrayList<Integer>(); 
    Numbers = new ArrayList<Integer>(); 
    Games = new ArrayList<ArrayList<Integer>>(); 
} 

public ArrayList<Integer> Numbers(){ 
    for(int i = 0; i < 49; i++){ 
     Numbers.add(i); 
    } 
    Collections.shuffle(Numbers); 
    return Numbers; 
} 
public void Generate(int numberOfGames){ 
    for (int i = 0; i < numberOfGames; i++){ 
     Numbers(); 
     for(int x = 0; x < 6; x++){ 
      Lottery.add(Numbers.get(x));     
     } 
     Collections.sort(Lottery); 
     Games.add(Lottery); 
    } 
} 

public void Display(){ 
    System.out.println(Games); 
} 
} 

這裏是我的測試:

public class Picker { 

private static int numberOfGames; 

public static void main(String[] args){ 
    System.out.println("Please enter the amount of games you would like to play"); 
    Scanner in = new Scanner(System.in); 
    numberOfGames = in.nextInt(); 
    LotteryTicket q = new LotteryTicket(); 
    ArrayList<ArrayList> game= new ArrayList<ArrayList>(); 
    q.Generate(numberOfGames); 
    q.Display(); 
} 
} 
+0

請告訴我們你想要什麼遊戲順序? – 2014-09-03 18:36:01

+0

順序無關緊要,因爲它是隨機的。只要每個彩票存儲在Game中的一個單獨的元素中,因爲現在它將它們全部存儲在相同的元素中,然後將該元素複製x次。 – user2782582 2014-09-03 18:39:05

回答

1

您需要爲每次迭代實例化彩票。

試試這個: -

public void Generate(int numberOfGames){ 
    for (int i = 0; i < numberOfGames; i++){ 
     Numbers(); 
     Lottery = new ArrayList<Integer>(); 
     for(int x = 0; x < 6; x++){ 
      Lottery.add(Numbers.get(x));     
     } 
     Collections.sort(Lottery); 
     Games.add(Lottery); 
    } 
} 

編輯: -

可避免號碼收集相同的情況下,以及也爲性能可以在數字採集從初始化1到49的數字構造函數只有一次,並且對於生成方法中的每個遊戲迭代,您可以將數字隨機洗牌,然後將其添加到彩票中。這避免了不必要的數字添加到Numbers集合

LotteryTicket(){ 
    Lottery = new ArrayList<Integer>(); 
    Numbers = new ArrayList<Integer>(); 
    Games = new ArrayList<ArrayList<Integer>>(); 
    Numbers(); // call this once from constructor as the total numbers in the Numbers collection is fixed which is from 1 to 49. 
} 

public ArrayList<Integer> Numbers(){ 
    for(int i = 0; i < 49; i++){ 
     Numbers.add(i); 
    } 
    Collections.shuffle(Numbers); 
    return Numbers; 
} 
public void Generate(int numberOfGames){ 
    for (int i = 0; i < numberOfGames; i++){ 
     Collections.shuffle(Numbers); // shuffle the numbers for every game 
     Lottery = new ArrayList<Integer>(); // create a new Lottery ticket 
     for(int x = 0; x < 6; x++){ 
      Lottery.add(Numbers.get(x));     
     } 
     Collections.sort(Lottery); 
     Games.add(Lottery); 
    } 
} 
+0

好的,完美的工作。謝謝,沒有意識到必須這樣做,但現在有道理,因爲如果我沒有,我只是增加更多的數字到彩票。 – user2782582 2014-09-03 18:48:23

+0

@ user2782582請檢查編輯有幾個建議 – 2014-09-03 18:57:56

+0

我所做的是我在構造函數中做了for循環,而不是有一個方法。爲它創建一個方法還是隻在構造函數中創建它更好? – user2782582 2014-09-03 21:50:44

0

我看到的主要問題是,你是不是清空你的號碼和彩票排列,從遊戲到遊戲,導致以前的編號已經在那裏。

試試這個:

public void Generate(int numberOfGames){ 
    for (int i = 0; i < numberOfGames; i++){ 
     Numbers(); 
     for(int x = 0; x < 6; x++){ 
      Lottery.add(Numbers.get(x));     
     } 

     //reset the array the numbers array so we can re add numbers after. 
     Numbers.clear(); 
     Collections.sort(Lottery); 
     Games.add(Lottery); 

     //reset the lottery array so we can have a new lottery after. 
     Lottery.clear(); 
    } 
} 

這將是速戰速決。爲了更好的一個。嘗試在構造函數中只初始化一次「Numbers」(每次運行遊戲時都不需要新數字,是嗎?)