【问题标题】:Can I simplify this for loop?我可以简化这个 for 循环吗?
【发布时间】:2014-01-12 23:43:02
【问题描述】:

以下代码段来自生成 5 x 5 网格的 JButton 的系统。我需要遍历JButtonsArrayList 并将JButton 的行和列传递给ButtonListener 的构造函数。代码当前显示在下面的方式有效,但我想知道是否可以完全清理代码或以任何方式重新考虑。我似乎有很多关于尝试构建网格的说明。

    int row = 1, col = 1;
    for (JButton curButton : view.getButtons()) {

        curButton.addActionListener(new ButtonListener(row, col));
        row++;

        if (row > 5) {
            row = 1;
            col++;
        }           
    }

有什么办法可以提高质量或简化上述代码段?

【问题讨论】:

  • 为什么不直接使用带有ij 的传统双循环而不是rowcol编辑:如果你愿意,它们可以继续被称为 rowcol,并且仍然可以使用双 for 循环正确递增

标签: java refactoring


【解决方案1】:
int iterator = 0;
for (JButton curButton : view.getButtons()) {

    curButton.addActionListener(new ButtonListener(iterator%5 + 1, iterator/5 + 1));

    iterator++; 
}

请注意,我使用的是整数除法,它总是向下取整。 iterator/5 + 1 会将 {0,1,2,3,4,5,6,...} 映射到 {1,1,1,1,1,2,2...}

【讨论】:

  • 这似乎是最干净的解决方案。
【解决方案2】:

你不能:

col = row = 5;
for (int i = 0; i < col; i++) {
    for (int j = 0; j < row; j++) {
         curButton.addActionListener(new ButtonListener(i, j));
    }
}

可能必须使 col 和 row 6 或 i 和 j 从不同的数字开始。

【讨论】:

  • 这不允许将新的ButtonListener 添加到view.getButtons() 中的每个JButton
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多