如何向函数传入ArrayList实现类似Java数组的元素交换效果
ArrayList交换指定位置元素的报错解决
对于Java数组,我们可以通过如下方式交换索引first和second位置的元素:
public void func(int[] array) { int first = 1; int second = 2; swap(array, first, second); } public void swap(int[] array, int first, int second) { int tmp = array[first]; array[first] = array[second]; array[second] = tmp; }
如果使用ArrayList,要如何实现相同的元素交换效果?
尝试编写的实现代码如下:
public void swap(ArrayList<Integer> array, int first, int second){ int tmp = array.get(first); array.set(first, array.get(second)); array.set(second, tmp); }
运行时代码抛出如下错误:
error: non-static method swap(ArrayList,int,int) cannot be referenced from a static context
swap(A, i, j);
问题原因与解决方法
你写的ArrayList元素交换逻辑本身没有问题:数组用下标直接读写,ArrayList用get()读、set()写,二者交换元素的思路完全一致。
报错和ArrayList操作无关,核心是Java的静态方法调用规则:
你定义的swap是没有加static修饰的非静态成员方法,这类方法必须绑定类的实例对象才能调用。但你调用swap(A,i,j)的位置在静态上下文(最常见的就是main方法,或是其他被static修饰的方法)中,静态上下文不存在当前类的实例,因此无法直接调用非静态方法。
两种修复方案选其一即可:
- 给
swap方法加上static修饰符,将其改为静态方法,就可以直接在静态上下文中调用,修改后的方法签名为public static void swap(ArrayList<Integer> array, int first, int second) - 如果不希望修改方法为静态,可以先实例化当前类的对象,通过对象调用方法,示例:
new Demo().swap(A, i, j)(Demo替换为你当前类的类名)
另外JDK自带的java.util.Collections工具类已经封装了通用的列表交换方法,直接调用Collections.swap(yourList, first, second)即可完成任意List实现类的指定位置元素交换,不需要手动写交换逻辑。
内容的提问来源于stack exchange,提问作者kalki
相关产品推荐
相关产品推荐

