如何使用map和forEach显示tictactoe板?

时间:2017-06-28 22:46:59

标签: java collections java-8

我想要展示tic tac toe board。这样的事情:

XXX
XXX
XXX

是否有可能为每个人实现这一目标? 我试着做一些:

    Map<Integer, Tile> board = generateBoard();

    for (Map.Entry<Integer, Tile> entry: board.entrySet()){
        System.out.print(entry.getValue().getSign());
    }

    board.forEach((k,v) -> {
        int i = 1;
        if(i % 3 == 0){
            System.out.println();
        }
        System.out.print(v.getSign());
        i++;
    });

但我的输出不正确。你能给我任何输出来实现这个输出吗?

3 个答案:

答案 0 :(得分:1)

一个明显的问题是i没有递增,因为你在每次迭代时都重新定义它。不幸的是,labmdas和有状态变量混合不好。我建议改为使用常规for循环:

int i = 0;
for (Tile tile : board.values()) {
    System.out.print(tile.getSign());
    if (++i % 3 == 0) {
        System.out.println();
    }
}

答案 1 :(得分:0)

两件事:

  1. 你的i永远不会增加,因为它在循环中声明。它总是1。
  2. 如果您有“k”(索引),为什么要创建新索引?
  3. 删除i并用k替换它,看看是否有帮助。

答案 2 :(得分:0)

lambda外部lambda中引用的变量必须是Effectively Final或final。这可以防止您轻松增加计数器,记住您所处的位置。

假设地图中的整数键是插槽号,您可以执行此操作。

 board.forEach((k,v) -> {
        System.out.print(v.getSign());
        if(k % 3 == 0){
            System.out.println();
        }
    });