用于交换原语的Java方法

hig*_*der 41 java

如果没有我们可以通过引用传递的方法,如何在java中创建交换函数?有人可以给我一个代码吗?

swap(int a, int b)
{
     int temp = a;
     a = b;
     b = temp;
}
Run Code Online (Sandbox Code Playgroud)

但是由于java通过值传递,因此不会反映出这种变化

dan*_*lmo 65

我认为这是最接近简单交换的,但它没有简单的使用模式:

int swap(int a, int b) {  // usage: y = swap(x, x=y);
   return a;
}

y = swap(x, x=y);
Run Code Online (Sandbox Code Playgroud)

它依赖于x将被分配到swap之前传入的事实,然后返回并分配给.yxxy

您可以使它成为通用的并交换任意数量的相同类型的对象:

<T> T swap(T... args) {   // usage: z = swap(a, a=b, b=c, ... y=z);
    return args[0];
}

c = swap(a, a=b, b=c)
Run Code Online (Sandbox Code Playgroud)

  • 聪明.太聪明了.依赖于正确编写此模式的人.以后读起来非常不明显.我也会在生产中否决这样一段代码.但我同意这是非常有趣的.很近... (6认同)
  • 我同意,一个好主意,但也很危险......因为它依赖于调用时的参数赋值,任何具有此方法的项目迟早会因此而遇到错误.如果我是领导者,那么在生产代码中不允许这样做. (5认同)
  • @deserthero你还应该注意,方法名称`swap`是一个简单的谎言,它不会做它应该做的事情.这个想法可能不错,但是这段代码不应该通过任何代码审查. (5认同)
  • 这实际上是个不错的主意. (2认同)
  • 因为它依赖于调用时的参数赋值,所以可能会出现某种情况,某种程度上,某些Java实现可能会导致错误.此外,如我的描述中所述,使用模式并不简单. (2认同)
  • 这非常聪明,但这只是一个非常糟糕的骇客技巧。对于打高尔夫/混淆代码很有用,但仅此而已。不应在实际代码中使用它。我了解您是要解决OP问题的,但实际上此函数根本不交换任何内容,这只是参数评估的副作用。这应该有一个非常大的注释,例如:“ *孩子,不要在家尝试*”,否则新手可能会认为这是一个好习惯(我被其中一个链接到这里)。简单的{{&lt;type&gt; temp = a; a = b; b =温度;}`仍然好得多。 (2认同)

sep*_*p2k 24

您无法创建方法交换,因此在调用swap(x,y)x和y的值之后将进行交换.你可以通过交换它们的内容来为可变类创建这样一个方法,但是这不会改变它们的对象标识,你也无法为它定义一般方法.

但是,您可以编写一个方法,在数组或列表中交换两个项目(如果这是您想要的).

¹例如,您可以创建一个带有两个列表的交换方法,并且在执行该方法之后,列表x将具有列表y的先前内容,列表y将具有列表x的先前内容.

  • 您可以创建一个名为`y = swap(x)的[方法](http://stackoverflow.com/questions/2393906/how-do-i-make-my-swap-function-in-java/20600020#20600020) ,x = y)`交换x和y. (7认同)

pol*_*nts 13

这取决于你想做什么.此代码交换数组的两个元素.

void swap(int i, int j, int[] arr) {
  int t = arr[i];
  arr[i] = arr[j];
  arr[j] = t;
}
Run Code Online (Sandbox Code Playgroud)

像这样的东西交换两个int[]相等长度的内容.

void swap(int[] arr1, int[] arr2) {
  int[] t = arr1.clone();
  System.arraycopy(arr2, 0, arr1, 0, t.length);
  System.arraycopy(t, 0, arr2, 0, t.length);
}
Run Code Online (Sandbox Code Playgroud)

像这样的东西交换两个内容BitSet(使用XOR交换算法):

void swap(BitSet s1, BitSet s2) {
  s1.xor(s2);
  s2.xor(s1);
  s1.xor(s2);
}
Run Code Online (Sandbox Code Playgroud)

像这样的交换xy一些领域Point类:

void swapXY(Point p) {
  int t = p.x;
  p.x = p.y;
  p.y = t;
}
Run Code Online (Sandbox Code Playgroud)

  • @DJ:数组(与所有对象一样)是引用类型.这意味着对方法内对象所做的任何更改都将在外部可见(这也意味着将对象传递给方法不会复制对象的内容,因此传递1M元素数组不会复制1M对象).但是,重新分配引用该数组的变量将不会在外部可见(这意味着如果您在方法中执行类似`arr1 = arr2`的操作,则不会对外部产生任何可见影响). (2认同)

Dút*_*has 6

显然,我没有足够的信誉分Dansalmo的答案,但它是一个很好的,虽然错命名.他的回答实际上是K-combinator.

int K( int a, int b ) {
    return a;
}
Run Code Online (Sandbox Code Playgroud)

JLS传递给方法/构建函数/等时是具体的关于论证评估.(在旧规格中不是这样吗?)

当然,这是一个功能性的习惯用语,但对于那些认识它的人来说它已经足够清楚了.(如果你不理解你找到的代码,不要乱用它!)

y = K(x, x=y);  // swap x and y
Run Code Online (Sandbox Code Playgroud)

K-combinator专为此类设计而设计.AFAIK没有理由不通过代码审查.

我的0.02美元.

  • 既然您有足够的声誉,请将其移至评论中.谢谢! (3认同)