Java - повторная ссылка на массив методом - PullRequest
0 голосов
/ 23 октября 2011

:)

Проблема, с которой я столкнулся: это очень упрощенная версия того, что я пытаюсь сделать, поскольку мне действительно нужно пересчитать большой массив цветов (взятый из Color Object), и мне нужно отсортировать их, и удалять и считать дубликаты в 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

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Это не работает, потому что Java передает аргументы по значению (даже если это значение является ссылкой, такой как ссылка на массив).Он не может изменить значение b1 в пределах relink - потому что все, что он получает, является копией значения b1.(Ну, в этом случае он может назначить напрямую на b1, потому что это метод экземпляра, а b1 - переменная экземпляра, но я подозреваю, что это просто совпадение, которое может быть недопустимым в вашем реальном коде.)

Если вы хотите, чтобы две переменные ссылались на один и тот же массив, почему бы вам просто не использовать оператор присваивания в вызывающем методе?

b1 = a1;

В качестве альтернативы, если у вас есть другиечтобы поработать, вы могли бы потенциально сделать метод return ссылкой на соответствующий массив:

b1 = relink(a1);

Трудно точно определить, что является наиболее подходящим, поскольку вы на самом деле нам не говорили очто ты пытаешься сделатьЕсли вы хотите иметь возможность удалять элементы, то массивы вполне могут быть используемой структурой данных неправильно именно потому, что вы не можете удалять элементы из них.Вы рассматривали возможность использования реализации List<E>, такой как ArrayList<E>?

0 голосов
/ 25 октября 2011

Если в свопе есть , который должен быть выполнен с помощью метода, вы можете обернуть дескрипторы своих массивов в объекты-держатели, чтобы имитировать передачу их по ссылке.Тем не менее, это добавляет еще один уровень косвенности, который снижает производительность.

Пример:

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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...