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

时间:2013-10-07 05:51:54

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

12 个答案:

答案 0 :(得分:23)

简短的回答是你不能用Java来处理!

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

如果你有两只手和两个球,将球转向对手的唯一方法就是将一个球扔到空中(或类似的东西)。但是没有&#34;抛出一个价值空气&#34;在Java中运作。

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

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


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

答案 1 :(得分:6)

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

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

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

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

使用temp:

  • temp = a; - &GT; a = 5,b = 10,temp = 5.
  • a = b; - &GT; a = 10,b = 10,temp = 5。
  • b = temp; - &GT; a = 10,b = 5,temp = 5.
  • a和b现在已被交换。

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

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

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

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

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

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变量的想法

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

a=1, b=2, c;

c=a; 表示c=1;

a为空。 a=b; 表示a=2;

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

您可以看到ab交换的值。

答案 6 :(得分: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];
        }
    }
}

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

需要第三个变量,因为您需要临时保存一个变量。 如果您执行arr[i] = arr[j],则会覆盖arr[i]的内容,其内容为arr[j],因此如果您尚未保存,则会丢失该值。

(你可以通过做一个所谓的XOR swap而不使用第三个变量来交换值,这涉及一些修补。)

答案 9 :(得分:0)

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

不使用第三个变量

int a = 10;
int b = 20;

a = a + b; 
b = a - b;
a = a - b;

答案 10 :(得分:0)

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

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

(或者更确切地说:

  1. 第一辆车将自己克隆到停车位
  2. 第二辆车将自己克隆到第一辆车的原件所在的位置,然后将其摧毁
  3. 第一辆汽车的克隆将自己克隆到第二辆汽车的原件所在的位置,然后摧毁它......现在这两辆汽车已交换了位置。
  4. 呃,没关系,为了简单起见,我们放弃精确度。)

答案 11 :(得分:-1)

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

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