Java-通过方法重新引用数组
:) 我遇到的问题是:这是我试图做的非常简化的版本,因为我实际上需要重新计算一个大的颜色数组(取自Java-通过方法重新引用数组,java,arrays,pointers,Java,Arrays,Pointers,:) 我遇到的问题是:这是我试图做的非常简化的版本,因为我实际上需要重新计算一个大的颜色数组(取自ColorObject),需要对它们进行排序,并在两个数组中删除和计数重复的颜色。(或者不管我应该使用什么数据模型,我选择了2个数组)。 我遇到的问题是,我不能在方法中重新引用数组,因为它之后会留在那里 public class Algos2 { private int[] b1 = null; public void relink(int[] a1, int[] a2) { a
Color
Object),需要对它们进行排序,并在两个数组中删除和计数重复的颜色。(或者不管我应该使用什么数据模型,我选择了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
这不起作用,因为Java按值传递参数(即使该值是引用,例如对数组的引用)。它无法在重新链接中更改b1
的值,因为它接收的只是b1
值的副本。(在本例中,它可以直接分配给b1
,因为它是一个实例方法,b1
是一个实例变量,但我怀疑这只是巧合,在实际代码中可能无效。)
如果希望这两个变量引用同一个数组,为什么不在调用方法中使用赋值运算符呢
b1 = a1;
或者,如果您还有其他工作要做,您可以让该方法返回对适当数组的引用:
b1 = relink(a1);
很难确切知道什么是最合适的,因为你还没有真正告诉我们你想做什么。如果您希望能够删除元素,那么数组很可能是错误的数据结构,因为您无法从数组中删除元素。您是否考虑过改用列表
实现,例如ArrayList
?如果必须使用方法进行交换,您可以将句柄包装到“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));
}
}
class-Ref{
公共交通工具;
public Ref(T obj){this.obj=obj;}
公共静态无效交换(参考a、参考b){
T aux=a.obj;
a、 obj=b.obj;
b、 obj=辅助;
}
}
课堂测试{
公共静态void main(字符串[]args){
参考文献a1,b1;
a1=新的Ref(新的int[]{1,2,3});
b1=新的Ref(新的int[]{4,5,6});
System.out.println(java.util.array.toString(a1.obj));
System.out.println(java.util.array.toString(b1.obj));
System.out.println(“交换”);
参考互换(a1,b1);
System.out.println(java.util.array.toString(a1.obj));
System.out.println(java.util.array.toString(b1.obj));
}
}
嗯,有点。但事实上,我正在努力解决其中最简单的部分。家庭作业是我遗漏的解释和代码。你是否尝试过使用其他数据类型,如jon在回答中建议的ArrayList?@luketorjussen遗憾的是,我还没有。也许这是解决整个问题的关键。谢谢。我已经试过了,只是我需要把一个数组分成两个不同的数组。我将把所有代码复制到这里:@Cilice:显示所有代码并不能真正解释您要实现的目标。但从根本上讲,您需要处理Java按值传递参数这一事实。你离不开它。我会用ArrayList试试,从外观上看似乎可以解决问题。谢谢。@Cilice更多细节请参阅我的答案。