迭代器没有按照我想要的方式行事。我究竟做错了什么?

时间:2013-04-27 13:57:14

标签: java

我正在做一个轮盘赌游戏作为初学者而且我被卡住了。

我选择了 Bin - 对象

Bin(){
    outcomes = new TreeSet<Outcome>();
}

我有投注 - 对象

public Bet(int amount, Outcome outcome){
    this.outcome = outcome;
    this.amountBet = amount;
}

包含结果 - 对象。

public Outcome(String name, int odds){
        this.name = name;
        this.odds = odds;
    }

目标 - 迭代Bin中的所有结果,并将Bin中的Outcome.name与bets.outcome.name进行比较。如果我们有马赫,那就有胜利。如果没有,就会有损失。

所以,这是我的代码:

System.out.println(bin.toString());
System.out.println(table.bets.toString());

System.out.println(black.toString());

ListIterator<Bet> i = table.bets.listIterator();
    Iterator<Outcome> b = bin.outcomes.iterator();

    while(i.hasNext()) {

        while(b.hasNext()){


            if(i.next().outcome.equals(b.next())){

                System.out.println("Win!");

            }
            else System.out.println("Win :/");
        }


    }

问题:即使输出显示:

[8 (35:1)]['7, 71' (17:1)]['8, 81' (17:1)][5, 53 (17:1)][8, 83 (17:1)][7 (11:1)][4, 41,    
43, 44 (8:1)][5, 51, 53, 54 (17:1)][7, 71, 73, 74 (8:1)][8, 81, 83, 84 (17:1)][4, 5,6,   
7, 8, 9 (5:1)][7, 8,9, 10, 11, 12 (5:1)][1 (2:1)][11 (2:1)][Low (1:1)][Even (1:1)]  

[Black (1:1)]

[10 on [Black (35:1)]]

Black (35:1)

No :/

Exception in thread "main" java.util.NoSuchElementException
at java.util.LinkedList$ListItr.next(Unknown Source)
at Roulette.Game.main(Game.java:37)

似乎是

a)不迭代Bin中的所有结果 b)当找到匹配项时,它不会评估是否为真。

你能看出我做错了吗?

非常感谢你的帮助!!

如果文字太多或太少,我很抱歉。万一你需要看看其他课程中发生了什么,这里是:

游戏类https://gist.github.com/anonymous/5473187

表类https://gist.github.com/anonymous/5473188

投注班级https://gist.github.com/anonymous/5473189

结果班https://gist.github.com/anonymous/5473191

Bin Class https://gist.github.com/anonymous/5473192

BinBuilder班级https://gist.github.com/anonymous/5473197

轮班https://gist.github.com/anonymous/5473200

NonRandom class https://gist.github.com/anonymous/5473202

Passenger57 Class https://gist.github.com/anonymous/5473207

修改:删除了System.out.println()并更新了新结果。

2 个答案:

答案 0 :(得分:3)

您每次致电i.next()b.next()两次。 next()转到下一个元素,因此如果您有序列1,2,3,4,则打印1,3,并比较2,4。

将结果复制到变量中以避免println()语句中出现这种意外的副作用:

ListIterator<Bet> i = table.bets.listIterator();
Iterator<Outcome> b = bin.outcomes.iterator();

while(i.hasNext()) {
  Bet bet = i.next();
  System.out.println(bet.outcome.name.toString());
  while(b.hasNext()){
    Outcome o = b.next();
    System.out.println(o.name.toString());

    if(bet.outcome.equals(o)){
      System.out.println("Win!");
    } else {
      System.out.println("Win :/");
    }
}

P.S。:

最干净的解决方案可能是避免使用迭代器并在相应的迭代中使用for循环。

答案 1 :(得分:1)

试试这个:

while(b.hasNext()){
    String str = b.next().name.toString()
    System.out.println(str);

    if(i.next().outcome.equals(str))
        System.out.println("Win!");

    else 
        System.out.println("Win :/");
}

而不是:

while(b.hasNext()){
    System.out.println(b.next().name.toString());

    if(i.next().outcome.equals(b.next())){    
        System.out.println("Win!");

    }
    else 
        System.out.println("Win :/");
}