:)
我遇到的问题:这是我正在尝试做的非常简化的版本,因为我实际上需要重新计算大量的颜色(取自Color
对象),并且需要排序它们,并删除和计算2个数组中的重复项。 (或者我应该使用的任何数据模型,我选择了2个数组)。
我遇到的问题是我不能在方法中重新引用数组,就像它之后停留在那里一样。
public class Algos2 {
private int[] b1 = null;
public void relink(int[] a1, int[] a2) {
a2 = a1;
}
public Algos2() {
int[] a1 = { 0, 5, 5, 5, 3, 3, 0, 0, 1, 2, 1, 5};
relink(a1, b1);
System.out.println("a1 " + a1); // whatever, working
System.out.println("b1 " + b1); // still null
}
public static void main(String[] args) {
new Algos2();
}
}
b1
之后应返回与a1
相同的指针。我需要在一个方法中做到这一点。 :/
编辑:我也不能直接做,通过方法返回一个数组。所以没有:public int[] relink(int[] a1) {return a1;}
因为我也需要在另一种方法中调用它,这也导致null
答案 0 :(得分:2)
这不起作用,因为Java按值传递参数(即使该值是引用,例如对数组的引用)。它无法更改b1
中relink
的值 - 因为它收到的只是b1
值的副本。 (好吧,在这种情况下,它可以直接将分配给b1
,因为它是一个实例方法而b1
是一个实例变量,但我怀疑这只是巧合,可能不是在您的真实代码中有效。)
如果你想让两个变量引用同一个数组,你为什么不在调用方法中使用赋值运算符?
b1 = a1;
或者,如果您还有其他工作要做,您可以使方法返回对相应数组的引用:
b1 = relink(a1);
很难确切地知道什么是最合适的,因为你还没有真正告诉我们你想要做什么。如果您希望能够删除元素,那么数组很可能是错误的数据结构,正是因为您无法从中删除元素。您是否考虑过使用List<E>
实施,例如ArrayList<E>
?
答案 1 :(得分:0)
如果使用方法完成swap ,则可以将句柄包装到“holder”对象中的数组中,以模拟通过引用传递它们。但是,这会增加另一层间接性,这会降低性能。
示例:
class Ref<T>{
public T obj;
public Ref(T obj){this.obj = obj;}
public static <T> void swap(Ref<T> a, Ref<T> b){
T aux = a.obj;
a.obj = b.obj;
b.obj = aux;
}
}
class test{
public static void main(String[]args){
Ref<int[]> a1, b1;
a1 = new Ref<int[]>(new int[]{1,2,3});
b1 = new Ref<int[]>(new int[]{4,5,6});
System.out.println(java.util.Arrays.toString(a1.obj));
System.out.println(java.util.Arrays.toString(b1.obj));
System.out.println("Swap.");
Ref.swap(a1, b1);
System.out.println(java.util.Arrays.toString(a1.obj));
System.out.println(java.util.Arrays.toString(b1.obj));
}
}