Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-通过方法重新引用数组_Java_Arrays_Pointers - Fatal编程技术网

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更多细节请参阅我的答案。