如何解决声纳问题squid:ForLoopCounterChangedCheck



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

以下是代码片段:

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循环,因为行为将与所需的不同。

如果有人能就如何解决这一违规问题提供建议,我们将不胜感激。提前谢谢。

将参数列表拆分为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());
}

最新更新