【问题标题】:Simplifying Java code by creating one method... but where?通过创建一种方法来简化 Java 代码……但是在哪里?
【发布时间】:2013-01-23 22:41:01
【问题描述】:

我正在尝试编写一些在作业中给出的伪代码 - 但是我现在正在做的编码部分不是作业的一部分,只是为了好玩。

伪代码的一部分说“交换数组的元素”。在我的代码中,我必须在两个地方执行此操作。但是我想知道是否有一种方法可以通过只创建一个方法来做到这一点,即创建另一个方法来简单地交换它们并保存我每次想要运行它时使用的额外代码行。

问题是,如果我在这个方法之外创建一个全新的方法,我将不得不将数组作为参数发送并同时取出,我担心这会降低效率(显然没什么大不了的,但我正在努力为未来的大型项目学习)。

这是我的代码,其中包含重复的“交换”方法行。

public int[] myAlgorithm(int[] arrayOfInts, int size){
    boolean done = true;
    int j= 0;

    while (j <= n-2){
        if (arrayOfInts[j] > arrayOfInts[j+1]){
            int tempHolder = arrayOfInts[j];
            arrayOfInts[j] = arrayOfInts[j+1];
            arrayOfInts[j+1] = tempHolder;
            done = false;
        }
        j = j + 1;
    }
    j = size - 1;
    while (j >= 1){
        if (arrayOfInts[j] <= arrayOfInts[j-1]){
            int tempHolder = arrayOfInts[j];
            arrayOfInts[j] = arrayOfInts[j+1];
            arrayOfInts[j+1] = tempHolder;
            done = false;
        }
        j--;
    }
    if (!done)
        myAlgorithm(arrayOfInts, size)
    else
        return arrayOfInts;
}

【问题讨论】:

标签: java methods


【解决方案1】:

我必须将数组作为参数发送并取出

您只需要“发送”并直接在阵列上工作。在实践中,将参数传递给方法是一种非常便宜的操作,如果调用得足够频繁,编译器可能会对其进行优化,因此您不必担心太多(除非您通过分析证明这是性能损失您的申请)。

在您的情况下,您可以使用以下方法:

public void swap(int[] arrayOfInts, int i, int j) {
    int tempHolder = arrayOfInts[i];
    arrayOfInts[i] = arrayOfInts[j];
    arrayOfInts[j] = tempHolder;
}

你会这样称呼它:

swap(arrayOfInts, j, j+1);

为什么有效?

Java passes arguments by value,但对于对象(即非原始类型,包括数组),传递的值是对对象的引用。换句话说,swap 方法的参数是对与调用代码中相同的数组的引用,因此您可以直接处理该数组,而无需将其发送回调用方法。

【讨论】:

    【解决方案2】:

    如果有重复的代码位,则运行时间会更短。但它需要更多空间。

    问题在于您无法预测编译器将如何优化您的代码。您可以创建一个函数,该函数采用数组和两个索引并交换这些索引处的元素。编译器可能会将代码内联到您调用它的函数中。如果你不这样做,编译器可能会注意到你有重复的代码,如果它决定创建一个函数。

    写出你最容易阅读的代码,尤其是在效率差异如此之小的时候。

    【讨论】:

      【解决方案3】:

      问题是,如果我在这个方法之外创建一个全新的方法,我必须将数组作为参数发送并取出......

      实际上并非如此。在 Java 中,数组是一个对象。因此,当您将数组传递给方法时,您实际上只是传递了对数组的引用。您对方法内的数组所做的任何更改都将在方法调用之后出现。仅将 reference 传递给数组也意味着该方法将非常快,因为您不会复制整个数组。

      所以你可以写一个交换方法:

      private void swap(int[] arrayOfInts, int i, int j) {
          int temp = arrayOfInts[i];
          arrayOfInts[i] = arrayOfInts[j];
          arrayOfInts[j] = temp;
      }
      

      【讨论】:

        【解决方案4】:

        数组,与任何其他引用类型的对象一样,都是通过引用传递的——即,对对象的引用是通过值传递的。这意味着,数组本身不会被复制。因此,没有理由担心“效率低下”。

        【讨论】:

          【解决方案5】:

          在 java 中,您可以将数组作为变量传递,这只会传递指向它的指针,而不是数组的全新副本,因此您必须传递数组和要交换的两个索引:

           public static void swap(final int[] arr, final int         pos1, final int pos2){
          final int temp = arr[pos1];
          arr[pos1] = arr[pos2];
          arr[pos2] = temp;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多