我正在尝试编写一些在作业中给出的伪代码 - 但是我现在正在做的编码部分不是作业的一部分,只是为了好玩。
伪代码的一部分说"交换数组的元素"。在我的代码中,我必须在两个地方执行此操作。但是,我想知道是否有一种方法可以通过仅创建一种方法来做到这一点,即创建另一种方法,该方法可以简单地交换它们并保存我每次想要运行它时使用的额外代码行。
问题是,如果我在这个方法之外创建一个全新的方法,我将不得不将数组作为参数发送并取出,我担心这会降低效率(显然这里没什么大不了的,但我正在尝试学习未来更大的项目)。
这是我的代码,其中包含重复的"交换"方法行。
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;
}
我必须将数组作为参数发送并将其取出
您只需要"发送它"并直接处理数组。在实践中,将参数传递给方法是一个非常便宜的操作,如果调用频率足够高,编译器无论如何都可能会对其进行优化,因此您不必太担心它(除非您通过分析应用程序来证明这是性能损失)。
在您的情况下,您可以使用如下方法:
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 按值传递参数,但在对象(即非基元类型,包括数组)的情况下,传递的值是对对象的引用。换句话说,swap 方法的参数是对调用代码中相同数组的引用,因此您可以直接处理该数组,而无需将其发送回调用方法。
如果存在重复的代码位,则运行所需的时间更少。不过它需要更多的空间。
问题是您无法预测编译器将如何优化您的代码。您可以创建一个函数来获取数组和两个索引,并交换这些索引处的元素。编译器可能会在调用它的函数中内联代码。如果不这样做,编译器可能会注意到您复制了代码,并在必要时创建一个函数。
编写代码,以最佳方式阅读它,尤其是当效率差异如此之小时。
问题是,如果我在这个方法之外创建一个全新的方法,我将不得不将数组作为参数发送并取出......
事实并非如此。 在Java中,数组是一个对象。 因此,当您将数组传递给方法时,实际上只是传递对数组的引用。 对方法中的数组所做的任何更改都将在方法调用后出现。 仅传递对数组的引用也意味着该方法将非常快,因为您不会创建整个数组的副本。
所以你可以写一个交换方法:
private void swap(int[] arrayOfInts, int i, int j) {
int temp = arrayOfInts[i];
arrayOfInts[i] = arrayOfInts[j];
arrayOfInts[j] = temp;
}
数组与引用类型的任何其他对象一样,是通过引用传递的 - 即,对对象的引用是通过值传递的。这意味着,数组本身不会被复制。因此,没有必要担心"效率降低"。
您可以将数组作为变量传递,这只会传递指向它的指针,而不是数组的全新副本,因此您必须传递数组和要交换的两个索引:
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;
}