我是Java的新手,这是一个很好的编码技术吗?

时间:2018-03-07 21:42:28

标签: java

我正在尝试学习一些java,我从codefights的一些作业开始,我只是想问一下我的编码技术是否合适?例如,可以使用break in for循环和多个return语句吗?

    boolean almostIncreasingSequence(int[] sequence) 
    {
          int i;                                                                                                
          int firstTry = 0;                                  /* to indicate the first try */         
          int secondTry = 0;                                 /* to indicate the second try */               
          int indexOfBreakingElement = 0;                    /* to indicate which index of the array is not following the almost increasing sequence */                           
          int sizeOfSequence = sequence.length;                                               
          int[] newFixedArray = new int[sizeOfSequence - 1]; /* an array used to store the edited or fixed array for further processing */                                             
          for(i = 0; i < sizeOfSequence-1; i++)
          {
                if(sequence[i] >= sequence[i+1])
                {
                      indexOfBreakingElement = i+1;
                      firstTry = 1;
                      break;
                }
          }


      if(firstTry==1)
      {
            for(i = 0; i < indexOfBreakingElement; i++)
            {
                  newFixedArray[i] = sequence[i];  
            }
            for(i = indexOfBreakingElement+1; i < sizeOfSequence; i++)
            {
                  newFixedArray[i-1] = sequence[i]; 
            }
      }

      for(i = 0; i < sizeOfSequence-2; i++)
      {
            if(newFixedArray[i] >= newFixedArray[i+1])
            {
                  indexOfBreakingElement = i;
                  secondTry = 1;
                  break;
            }
      }

      if(secondTry==1)
      {
            for(i = indexOfBreakingElement+1; i < sizeOfSequence; i++)
            {
                  newFixedArray[i-1] = sequence[i]; 
            }
      }

      for(i = 0; i < sizeOfSequence-2; i++)
      {
            if(newFixedArray[i] >= newFixedArray[i+1])
            {
                  return false;
            }
      }
      return true;
}

2 个答案:

答案 0 :(得分:1)

是的,您的编码技术很好(或至少可以接受)。

break循环中使用for完全正常。事实上,它建议您可能拥有关于Java的高级知识,因为您已经证明您知道break将结束循环。

使用return多次也是如此,因为它表明你知道函数会在return之后停止运行,这意味着你知道使用多个return可以提高效率。

此外,您经常使用for循环表明您习惯使用它们,这很好。您使用ij作为计数器变量可以加强这种印象。

注意:我只想指出使用冗长的变量名称并不是最好的做法,因为你更容易犯一个拼写错误(也就是说,你的变量使用camelCase是好的)。

答案 1 :(得分:0)

我将方法重构为更小的方法,以向您展示我在评论中的含义示例。见下文。多个returnbreak语句以及许多变量都在一个方法中,很难阅读。通过将逻辑分解成更小的部分,它更易于管理。三个步骤 - 找到破坏元素,获取新的固定数组,检查它并根据它看起来返回boolean

public boolean isAlmostIncreasing(int[] sequence) {
    int[] newFixedArray = toNewFixedArray(sequence);

    for (int i = 0; i < newFixedArray.length - 1; i++) {
        if (newFixedArray[i] >= newFixedArray[i + 1]) {
            return false;
        }
    }

    return true;
}

private int[] toNewFixedArray(int[] sequence) {
    int[] newFixedArray = new int[sequence.length
                                - 1]; /* an array used to store the edited or fixed array for further processing */

    int indexOfBreakingElement = findBreakingElementIndex(sequence);

    if (indexOfBreakingElement > 0) {                   
        for (int i = 0; i < indexOfBreakingElement; i++) {
            newFixedArray[i] = sequence[i];
        }
        for (int i = indexOfBreakingElement + 1; i < sequence.length; i++) {
            newFixedArray[i - 1] = sequence[i];
        }
    }

    for (int i = 0; i < sequence.length - 2; i++) {
        if (newFixedArray[i] >= newFixedArray[i + 1]) {
            indexOfBreakingElement = i;
            for (int j = i + 1; j < sequence.length; j++) {
                newFixedArray[j - 1] = sequence[j];
            }
            break;
        }
    }

    return newFixedArray;
}

private int findBreakingElementIndex(int[] sequence) {
    int indexOfBreakingElement = 0;

    for (int i = 0; i < sequence.length - 1; i++) {
        if (sequence[i] >= sequence[i + 1]) {
            indexOfBreakingElement = i + 1;
            break;
        }
    }

    return indexOfBreakingElement;
}