Java中高效地交换数组元素

80

我想知道有没有比这种方法更有效的交换数组中两个元素的方式:

String temp = arr[1];
arr[1] = arr[2];
arr[2] = temp;

嗯,这显然不是坏事,甚至也不是错的,但我需要经常交换,所以我想知道是否有任何库或其他东西可以提供更高效的方法来做到这一点?


对于字符串?不是真的。如果您需要经常这样做,最好自己编写一个函数,然后就不会麻烦了。 - Grambot
4
如果您可以使用List而不是Array,您可以使用Collections.swap(List, i, j)。 - Sergio Nakanishi
@Sergio Nakanishi:有趣的观点,也许我能够转向集合,但我不确定纯数组使用是否更快? - Robin
4
@Robin:我通常更喜欢使用ArrayList而不是数组。ArrayList在内部使用一个数组,调用方法来操作数组的开销并不显著。《Effective Java》一书有更完整的理由来选择List而不是数组。 - Sergio Nakanishi
@SergioNakanishi 谢谢你的书籍推荐。我刚刚搜索了一下,看起来非常不错。 - Robin
这是最有效的方法之一。不同的替代方案在可读性上存在差异。在假设任何效率差异之前,先进行测量(使用适当的微基准测试框架)。 - greybeard
13个回答

0

对象和基本类型的解决方案:

public static final <T> void swap(final T[] arr, final int i, final int j) {
    T tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static final void swap(final boolean[] arr, final int i, final int j) {
    boolean tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static final void swap(final byte[] arr, final int i, final int j) {
    byte tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static final void swap(final short[] arr, final int i, final int j) {
    short tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static final void swap(final int[] arr, final int i, final int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static final void swap(final long[] arr, final int i, final int j) {
    long tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static final void swap(final char[] arr, final int i, final int j) {
    char tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static final void swap(final float[] arr, final int i, final int j) {
    float tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static final void swap(final double[] arr, final int i, final int j) {
    double tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

0

这只是一种“黑客”风格的方法:

int d[][] = new int[n][n];

static int swap(int a, int b) {
  return a;
}
...

in main class --> 

d[i][j + 1] = swap(d[i][j], d[i][j] = d[i][j + 1])

-3
public class SwapElements {

public static void main(String[] args) {

    int[] arr1 = new int[5];
    int[] arr2 = {10,20,30,40};

    System.out.println("arr1 Before Swapping " + Arrays.toString(arr1));
    System.out.println("arr2 Before Swapping " + Arrays.toString(arr2));

    int temp[];
    arr1[3] = 5;
    arr1[0] = 2;
    arr1[1] = 3;
    arr1[2] = 6;
    arr1[4] = 10;

    temp = arr1;
    arr1 = arr2;
    arr2 = temp;
    System.out.println("arr1 after Swapping " + Arrays.toString(arr1));
    System.out.println("arr2 after Swapping " + Arrays.toString(arr2));
}

}


2
这并没有回答问题。问题是要交换数组的元素。翻转两个数组的引用对修改它们的内容没有任何作用。更不用说你使用了与问题试图寻找替代方法相同的方法来切换数组了。 - Locke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接