在数组中交换元素(Java)

4

在Java中,是否有预定义的方法可以直接交换两个数组元素?我们可以使用带有或不带临时变量的函数来实现这一点,但我想知道是否有像Arrays.sort()这样的交换方法?


如果一个数组包含超过2个元素,它应该交换什么? - Haifeng Zhang
Collections.swap(List<?> list, int i, int j);Collections.swap(List<?> list, int i, int j); - Free-Minded
@Bhatt 数组会归入列表吗? - Soumya Kanti Naskar
1
没有,而且没有字节码指令可以做到这一点,所以你只能使用一个临时变量。 - David Ehrmann
3
给这个问题点踩的人在这之前必须给出合适的理由。 - Soumya Kanti Naskar
2个回答

4
你需要使用List接口的swap方法。 List.swap的定义如下...
public static <E> void swap(List<E> a, int i, int j) {
    E tmp = a.get(i);
    a.set(i, a.get(j));
    a.set(j, tmp);
}

这份文档说明了:这是一个多态算法:它可以交换任何类型的List中两个元素,不论其具体实现方式。

如果您不熟悉java集合,那么您首先需要熟悉一下。


3
在Java中,是否有预定义的方法可以直接交换两个数组元素?
默认情况下,Java API没有交换数组元素的函数。但是,您可以使用Collections.swap(list,index1,index2)来交换列表元素,并将数组转换为列表执行交换,然后再将列表转换为数组。
如果您不想执行此类操作,可以查看一些第三方库,它们可以提供这样的功能。
您还可以创建自己的通用函数。
例如:
public class Test {

    @SuppressWarnings("unchecked")
    public static <T> void swap(T[] arr, int index1, int index2) {
        // Need to add null check and index checks
        List<T> list = Arrays.asList(arr);
        Collections.swap(list, index1, index2);
        arr = (T[]) list.toArray();
    }

    public static void main(String[] args) {
        Integer[] arr = { 1, 2, 3, 4, 5 };
        swap(arr, 1, 2);
        System.out.println(Arrays.asList(arr));
    }

}

输出

[1, 3, 2, 4, 5]

注意:

  1. 以上函数不适用于原始数组。
  2. 添加@SuppressWarnings以避免未经检查的强制类型转换警告。

没有必要使用语句arr = (T[]) list.toArray(),实际上该语句没有任何效果。在您的描述中,“然后将列表转换为数组”,这并不是您的代码所做的。它直接交换支持列表的数组的元素。 - DodgyCodeException

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