8

什么需要使用第三个变量来交换数字?我很抱歉,但我不明白。

这是我根据每个元素的长度对数组元素进行排序的示例代码。正如您在此处看到的,我正在使用第三个变量,并交换数组的元素。我对这个程序有一个不同的实现,但是我在网上找到了下面的例子,并且想了解交换有什么用?如果有人可以向我解释,那就太好了。

public class StringSort {
    public static void main(String[] args) {
        String[] arr = new String[] { "abcd", "dexter", "stringsortexample", "fruit", "apple","car" };              
        compareArrayElements(arr);      

        System.out.println("The strings in the sorted order of length are: ");
        for (String sortedArray : arr) {
            System.out.println(sortedArray);
        }
    }

    public static void compareArrayElements(String[] arr) {
        String temp = "";
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i+1; j < arr.length; j++) {
                if (arr[i].length() > arr[j].length())
                {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }       
    }
}
4

12 回答 12

23

简短的回答是你不能在 Java 中玩杂耍!

将每个变量想象成一只可以“持有”一个值的手;例如一个球。

如果你有两只手和两个球,将球切换到另一只手的唯一方法是将其中一个球抛向空中(或类似的东西)。但是 Java 中没有“将值抛向空中”的操作。

如果你不能玩杂耍,你需要第三只手(或其他一些临时握住的地方)来交换球。在 Java 术语中,这意味着一个临时变量。

作为记录,我发现这个类比在我学习编程时非常有用。但不要走得太远:-)。


(事实上​​,如果我们谈论的是整数,有一个数学技巧可以用来交换数字……涉及XOR ……但它通常不起作用。)

于 2013-10-07T06:31:53.880 回答
6
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;

那是交换的一部分。如果没有临时临时变量,您将在旅途中丢失信息。

示例:int a = 5, b = 10;

现在交换没有 temp 的 a 和 b: a = b; --> a = 10, b = 10 -> 5 丢失,无法检索或获取。或者让我们试试: b = a; --> a = 5, b = 5 -> 10 丢失,无法找回。

有温度:

  • 温度=一个;--> a = 5,b = 10,温度 = 5。
  • a = b; --> a = 10,b = 10,温度 = 5。
  • b = 温度;--> a = 10,b = 5,温度 = 5。
  • a 和 b 现在交换了。

而已。临时变量存储一个变量的原始状态,因为当为变量分配新状态(或值)时,该状态会被覆盖并丢失。

在您的示例中,您使用交换将数字(信息)的位置与不同位置的数字进行了交换。在这里,您有一个属于选择排序类别的排序算法(而不是其他答案建议的冒泡排序)。

观看冒泡排序链接上的动画图像,您会了解交换的想法,然后查看选择排序链接以了解此处发生的情况。

在您的代码示例中,算法检查第一个位置并将其与数组中的任何其他位置进行比较。如果它在第一个位置找到一个较小的值作为当前值,它会交换两个数字。在外循环的一次迭代(内循环第一次完全完成)之后,数组中的第一个位置保持整个数组中的最小值,因为如果它更大,它会被换成更小的值,如果你测试了所有它上面的值包含最小的值。

在循环中的下一次运行 (i = 0++ = 1) 中,数组的其余部分 (i + 1 = 2) 将针对第二个位置 (i = 1) 进行测试。因此,在第二次迭代之后,索引 1 (arr 1 ) 包含第二小的数字(并且索引 0,arry[0] 包含最小的数字)。这样做直到数组的所有索引都以这种方式处理 - 实际上最后一个不能与其他索引一起检查,因为它确实是最后一个 - 并且因此对数组进行了排序。

于 2013-10-07T05:59:10.787 回答
4

您在这里拥有的一段代码是众所周知的冒泡排序。它是用于对数组/列表的值进行排序的算法。该算法比较每对相邻变量,如果它们的顺序错误,则交换它们。文章中有一个小动画图片可以帮助您了解什么是交换,看看它。
例如,您可以在python不使用临时变量的情况下交换两个变量,如下所示:

a, b = 1, 2
a, b = b, a # b is 1 and a is 2 now

但是在 Java 和其他我知道的类似 C 语法的语言(C、C++、C#)中,当你想交换两个变量时,你需要将第一个变量的值存储在一个临时变量中,将第二个变量的值分配给第一个变量,然后将存储在临时变量中的值(实际上是第一个变量的值)赋给第二个变量。这就是它的工作原理。

于 2013-10-07T05:59:42.493 回答
2
temp = arr[i];            
arr[i]= arr[j];            
arr[j]= temp;

你只是假设 arr[i]=5; arr[j]=6;如果您尝试使用 out 临时变量进行交换。然后你会丢失像 arr[i]=arr[j];//arr[i]=5 和 arr[j]=5 arr[j]=arr[i];// 两者都有 vale 5. I认为你理解临时变量的概念

于 2013-10-07T06:06:13.263 回答
1

假设您尝试在不使用第三个变量的情况下进行交换。

arr[i] = arr[j];
arr[j] = arr[i];

这里有一个明显的问题。因为您将 arr[j] 分配给 arr[i] 并且反之亦然,所以它们彼此相等。第三个变量确保您临时保存您覆盖的变量的内容,然后您可以将其分配给另一个变量。

于 2013-10-07T06:02:32.903 回答
1

a=1, b=2, c;

c=a; 手段c=1

a空。 a=b; 手段a=2

b空。 b=c; 手段b=1

你可以看到ab交换的值。

于 2013-10-07T06:05:10.857 回答
1

第三个变量将帮助您交换 2 个值,尤其是在字符串上。

Step 1: Move first value to temp (third variable in your case ); 
step 2: Move second value to first variable.
step 3: Move temp value to first variable.

在数字情况下,您有时可能会发现没有任何第三个变量的代码。在这种情况下,它的工作原理如下:

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

这里不需要任何第三个变量。

于 2013-10-07T06:27:31.643 回答
0

第三个变量是临时存储你想要交换的值,如果是整数,你可以通过一些数学计算,比如a= a+b-(b=a);,顺便说一下,上面代码永远不会对字符串数组进行排序。

于 2013-10-07T05:59:18.810 回答
0

交换对于更改数组的顺序很有用。有时您可能想要对数组进行排序或随机化,在这种情况下,您需要交换元素以获得所需的结果。

需要第三个变量,因为您需要临时保存一个变量。如果你这样做了,arr[i] = arr[j]那么你用的内容覆盖了内容arr[i]arr[j]所以如果你没有保存它,你就失去了那个值。

(您可以通过进行所谓的XOR 交换来交换值,而无需使用第三个变量,这涉及到一些修改。)

于 2013-10-07T05:59:23.347 回答
0

那么在java中没有必要使用第三个变量来交换2个变量。但是,当您使用第三个变量时,这很容易。

不使用第三个变量

int a = 10;
int b = 20;

a = a + b; 
b = a - b;
a = a - b;
于 2013-10-07T06:26:56.173 回答
0

出于同样的原因,当两辆车在一条非常狭窄的街道上相向行驶时,其中一辆车需要靠边停车才能让另一辆车通过。(因为两辆车或两个值,不能同时占据相同的空间,而至少其中一个被摧毁)。

类比不准确。如果第一辆车将自己克隆到一个停车位,然后第二辆车驶过第一辆车,摧毁它,然后第一辆车的克隆起飞,那会更精确。

(或者,更准确地说:

  1. 第一辆汽车将自己克隆到一个停车位
  2. 第二辆车将自己克隆到第一辆车的原件所在的位置,并摧毁它
  3. 第一辆车的克隆将自己克隆到第二辆车的原件所在的位置,将其摧毁……现在两辆车交换了位置。

呃,没关系,为了简单起见,让我们放弃精度。)

于 2013-10-07T06:52:05.330 回答
-1

这取决于你......你想如何使用它......例如,求解联立方程有多种方法可以求解,因此同样有许多逻辑要实现,你可以选择任何你想要的至...

就这一点而言,我相信在这里使用第三个变量将消除复杂性并提高可读性和理解力。

于 2013-10-07T05:59:44.133 回答