【问题标题】:Reduce number of for loops in method减少方法中的 for 循环数
【发布时间】:2015-10-07 19:06:03
【问题描述】:

我正在尝试减少此方法中 for 循环的数量,但我不知道如何做到这一点,同时仍保持逻辑完整而不转向其他方法。我想这样做是为了减少 McCabe Cycolmatic Complexity,每个循环都会增加 1。所以我想将方法​​减少 1。

  private void method(int page)
    {
        for (int i = 0; i < LINES_PER_PAGE; i++)
        {
            nextLine[i] = null;
        }
        try
        {
            Scanner temp = new Scanner(fileToPrint);
            for (int i = 0; i < page - 1; i++)
            {
                skipAPage(temp);
            }
            for (int i = 0; (i < LINES_PER_PAGE) && (temp.hasNext()); i++)
            {
                nextLine[i] = expandTabs(temp.nextLine());
            }
        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
    }

【问题讨论】:

  • 没有理由重构此代码,它具有可读性。但我建议始终在任何条件或循环语句之前和之后留出空格,它可能会增加 +2 行,但在眼睛上更容易。
  • 为什么不能将部分代码移到其他方法?您至少可以将第一部分提取到一些 clearLines(nextLine, LINES_PER_PAGE) 中,这在这种情况下是非常合乎逻辑的。

标签: java loops cyclomatic-complexity


【解决方案1】:
    for (int i = 0; i < LINES_PER_PAGE; i++) {
        nextLine[i] = null;
    }

这是完全没有必要的,因为在 java 中任何对象的默认值都是null

在其余两个循环中,您调用了两个不同的方法,而您的第二个循环也取决于参数,所以我不确定它们是否可以合并到一个循环中。


由于nextLine 似乎在方法之外声明,我建议您使用List&lt;Sometype&gt; 并将来自expandTabs(temp.nextLine()); 的元素添加到其中,每次进入方法时清除列表list.clear() .


试试这个代码。使用适当的类型声明List&lt;String&gt;。您可以使用myList.get(index) 方法从List 访问元素。

List<String> myList = new ArrayList<>();

private void method(int page) {
  try {
    myList.clear();            // Clear the list.
    Scanner temp = new Scanner(fileToPrint);
    for (int i = 0; i < page - 1; i++) {
      skipAPage(temp);
    }
    for (int i = 0; (i < LINES_PER_PAGE) && (temp.hasNext()); i++) {
      myList.add(expandTabs(temp.nextLine()));    // Add the elements to the list.
    }
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  }
}

【讨论】:

  • 这不是真的 - nextLine 在方法之外声明,因此可以在此方法之前填充。 for 循环不能保证完全填充 nextLine,因此清空元素是合理的。
  • @Sbodd 您的观察似乎是正确的。在这种情况下,我建议使用 List 而不是数组。这样他就不需要循环了。
  • @YoungHobbit 你能告诉我这个方法会是什么样子吗?我没有使用列表。不知道如何用这样的东西清除线条:List&lt;Integer&gt; myList = new ArrayList&lt;&gt;(Arrays.asList( expandTabs(temp.nextLine()) ));
  • @CarloOtto expandTabs(temp.nextLine()) 的返回类型和 nextLine[] 的类型是什么。
  • @YoungHobbit 都是字符串。 (expandTabs 是return temp.toString();
【解决方案2】:

我建议跳过skipAPage 步骤,因为我假设那里有另一个循环:

        Scanner temp = new Scanner(fileToPrint);
        int linesToSkip = page * LINES_PER_PAGE;
        int i = 0;
        while ( temp.hasNext() ) {

             if ( i >= linesToSkip && i < linesToSkip  + LINES_PER_PAGE)
                  nextLine[i] = expandTabs(temp.nextLine());
             else
                  temp.nextLine();
             i++;
        }

【讨论】:

    【解决方案3】:

    你可以替换

    for (int i = 0; i < LINES_PER_PAGE; i++)
        {
            nextLine[i] = null;
        }
    

    致电Arrays.fill

    【讨论】:

    • 或者完全跳过它——默认情况下,Objects 的数组被初始化为只包含null
    • @QPaysTaxes 如果method() 被调用两次怎么办?
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多