我可以简化这个 for 循环吗?

Posted

技术标签:

【中文标题】我可以简化这个 for 循环吗?【英文标题】:Can I simplify this for loop? 【发布时间】: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 循环正确递增 【参考方案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

以上是关于我可以简化这个 for 循环吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过简化在循环内循环循环

JDK1.8新特性Lambda表达式简化if-else里都有for循环的优化方式

用itertools.product简化嵌套for循环

Lua代码简化问题(变量,for循环)

算法:用itertools.product()简化嵌套for循环

这个表达式可以简化吗?