使用Java中的第三个变量进行交换

需要使用第三个变量来交换数字? 对不起,但是我没理解。

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

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[j].length()) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } } 

简短的回答是你不能玩Java!

将每个变量视为可以“保持”一个值的手; 例如一个球。

如果你有两只手和两个球,那么将球转向对手的唯一方法就是将一个球扔到空中(或类似的东西)。 但Java中没有“向空中投入价值”的操作。

如果你不能玩耍,你需要第三只手(或其他一些临时控制位置)来换球。 而在Java术语中,这意味着一个临时变量。

为了记录,我发现这个比喻在学习编程时非常有用。 但是不要太过分:-)。


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

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

这是交换的一部分。 如果没有临时的临时变量,您将失去信息。

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

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

随着临时:

  • temp = a; – > a = 5,b = 10,temp = 5。
  • a = b; – > a = 10,b = 10,temp = 5。
  • b = temp; – > a = 10,b = 5,temp = 5。
  • 现在交换了a和b。

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

在您的示例中,您使用交换来更改具有多个不同位置的数字(信息)的位置。 在这里,您有一个排序算法属于选择排序类别 (而不是冒充其他答案建议的排序 )。

在Bubble Sort链接中观看动画图像,您可以了解交换,然后查看Selection Sort链接以了解这里发生了什么。

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

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

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

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

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

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

你只是假设arr [i] = 5; ARR [J] = 6; 如果你尝试交换出temp变量。 那么你将丢失数据,如arr [i] = arr [j]; // arr [i] = 5和arr [j] = 5 arr [j] = arr [i]; //都有谷值5.我认为你了解temp变量的想法

我们只是说你试图在不使用第三个变量的情况下进行交换。

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

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

a=1, b=2, c;

c=a ; 意味着c=1 ;

让空虚。 a=b ; 表示a=2 ;

b空。 b=c ; 表示b=1 ;

你可以看到交换的ab值。

第三个变量将帮助您交换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;ia[j]){ a[i] = a[i]+a[j]; a[j]= a[i]-a[j]; a[i]= a[i]-a[j]; } } } 

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

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

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

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

(您可以通过执行所谓的XOR交换 交换值而不使用第三个变量,这需要一些修补。)

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

不使用第三个变量

 int a = 10; int b = 20; a = a + b; b = a - b; a = a - b; 

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

这个比喻并不准确。 如果第一辆车克隆到一个停车位,然后第二辆车驶过第一辆车,摧毁它,那么第一辆车的克隆就会起飞,那就更准确了。

(或者,甚至更精确:

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

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

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

至于这个问题,我相信在这里使用第三个变量将消除复杂性并提高可读性和理解力。