2014-09-03 57 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”(每次运行游戏时都不需要新数字,是吗?)