【问题标题】:How to fix sonar issue squid:ForLoopCounterChangedCheck?如何解决声纳问题 squid:ForLoopCounterChangedCheck?
【发布时间】:2020-12-02 23:33:40
【问题描述】:

我的代码被声纳检测到违反“for”循环停止条件应该是不变的。 我试图修复它,但声纳认为问题仍然存在,因为我的 for 循环在另一个 for 循环中。

这里是sn-p的代码:

int limit = Const.getBatchLimit();
int count = 0;

for (int paramIndex = 0; paramIndex < paramList.size();)
{
    List<Param> tempParam = new ArrayList<>();
    StringBuilder retrieveMsg = new StringBuilder("Retrieving: \n");
    for (count = 0; (count < limit) && (paramIndex < param.size()); count++, paramIndex++)
    {
        Param myParam = paramList.get(paramIndex);
        retrieveMsg.append(myParam .seq()).append(Str.SLASH).append(Str.CRLF);
        tempParam.add(myParam);
    }
    LOGGER.info(retrieveMsg.toString());

    LOGGER.info("Done. Retrieved count: " + tempParam.size());
}

我无法将 paramIndex++ 移至第一个 for 循环,因为其行为与预期不同。

如果有人可以就如何解决此违规问题提供建议,我们将不胜感激。 提前谢谢你。

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    将参数列表拆分为limit 大小的块是一种有趣的方式,但它可能完全摆脱嵌套循环。

    另外,如果tempParam仅用于跟踪批次中的元素数量,则可以通过重复使用count来替换。

    int limit = Const.getBatchLimit();
    
    StringBuilder retrieveMsg = new StringBuilder("Retrieving: \n");
    
    for (int i = 0, count = 1, n = paramList.size(); i < n; i++, count++) {
        Param myParam = paramList.get(i);
        retrieveMsg.append(myParam.seq()).append(Str.SLASH).append(Str.CRLF);
    
        if (count % limit == 0 || i == n - 1) {
            LOGGER.info(retrieveMsg.toString());
            LOGGER.info("Done. Retrieved count: " + count);
            retrieveMsg = new StringBuilder("Retrieving: \n");
            count = 0;
        }
    }
    

    或者可以完全重构这段代码以使用 Java Stream API 并实现一个辅助方法来处理块(例如printChunk):

    int chunks = paramList.size() / limit + (paramList.size() % limit == 0 ? 0 : 1);
    IntStream.range(0, chunks)
             .mapToObj(i -> paramList.subList(i * limit, Math.min((i + 1) * limit, paramList.size()))) // getting stream of sublists
             .forEach(MyClass::printChunk);
    
    // ...
    static void printChunk(List<Param> chunk) {
        StringBuilder msg = new StringBuilder("Retrieving:\n");
        chunk.forEach(p -> msg.append(p.seq()).append(Str.SLASH).append(Str.CRLF));
    
        LOGGER.info(msg.toString());
        LOGGER.info("Done. Retrieved count: " + chunk.size());
    }
    
    

    【讨论】:

    • 感谢您的回答。会试一试,让你知道什么是有效的。
    • 尝试了你的第一个建议,它奏效了。再次感谢。
    猜你喜欢
    • 2016-01-03
    • 2021-03-10
    • 2021-07-14
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2018-06-09
    • 2011-03-02
    • 2020-11-14
    相关资源
    最近更新 更多