Как поменять поля 2 объектов в Java? - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть два объекта класса TreeNode.Они называются a и b со следующими полями:

value
index
parent
leftChild 
rightChild

Я хочу создать функцию

swap(a,b)

, которая меняет поля a на поля b и наоборот.

Я пытался создать такую ​​функцию, но она была довольно продолжительной и неэффективной, поскольку значения не меняются, как ожидалось.Есть ли простой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Копирование значений из b во временные переменные, установка значений от a до b, копирование значений из временных переменных в a.Вот и все.

0 голосов
/ 01 декабря 2018

В Java вы не можете этого сделать (по крайней мере, если вы буквально подразумеваете свой вопрос).

Какова ваша ситуация?Что-то похожее на:

    // This is the aTreeNode instance.
    TreeNode a = new TreeNode("ValueA", 4711, parentA, leftChildA, rightChildA);

    // This is the aTreeNode instance.
    TreeNode b = new TreeNode("ValueB", 4712, parentB, leftChildB, rightChildB);

У вас есть две переменные a и b, ссылающиеся на каждый экземпляр TreeNode (который я назвал aTreeNode и bTreeNode, просто чтобы дать им имена, которые яможно поговорить)И эти экземпляры имеют разные значения в своих полях.Давайте изобразим это:

    a -> aTreeNode instance
         ------------------
         "ValueA"
         4711
         -> parentA instance
         -> leftChildA instance
         -> rightChildA instance

    b -> bTreeNode instance
         ------------------
         "ValueB"
         4712
         -> parentB instance
         -> leftChildB instance
         -> rightChildB instance

Если вы вызываете метод, подобный swap(a, b), метод получает ссылки на экземпляры aTreeNode и bTreeNode.Поскольку метод не знает, откуда взялись эти ссылки (в нашем случае это переменные a и b, но он также может быть элементом массива или результатом вызова какого-либо другого метода), лучше всего этоможно сделать, чтобы поменять содержимое внутри этих экземпляров:

    a -> aTreeNode instance
         ------------------
         "ValueB"
         4712
         -> parentB instance
         -> leftChildB instance
         -> rightChildB instance

    b -> bTreeNode instance
         ------------------
         "ValueA"
         4711
         -> parentA instance
         -> leftChildA instance
         -> rightChildA instance

Итак, после вызова swap(a, b), a все еще ссылается на экземпляр aTreeNode, а b на bTreeNode, онитолько поменял их содержимое.И такие радикальные изменения содержимого экземпляра плохо вписываются в философию Java, что приводит к проблемам со многими библиотечными классами, например, со всеми видами коллекций и карт.

Итак, вам лучше поменяться местами.две переменные без вызова метода:

    TreeNode a = new TreeNode("ValueA", 4711, parentA, leftChildA, rightChildA);
    TreeNode b = new TreeNode("ValueB", 4712, parentB, leftChildB, rightChildB);

    TreeNode temp = a;
    a = b;
    b = temp;

Это намного быстрее, чище, и результат:

    a -> bTreeNode instance
         ------------------
         "ValueB"
         4712
         -> parentB instance
         -> leftChildB instance
         -> rightChildB instance

    b -> aTreeNode instance
         ------------------
         "ValueA"
         4711
         -> parentA instance
         -> leftChildA instance
         -> rightChildA instance
0 голосов
/ 01 декабря 2018

Я предполагаю, что типы полей:

  • значение - String
  • index - int
  • parent - TreeNode
  • leftChildis TreeNode
  • rightChild is TreeNode

Поэтому используйте классический метод обмена значениями для каждого из полей:

public static void swap(TreeNode a, TreeNode b) {
    String tempValue = a.value;
    a.value = b.value;
    b.value = tempValue;

    int tempIndex = a.index;
    a.index = b.index;
    b.index = tempIndex;

    TreeNode tempNode = a.parent;
    a.parent = b.parent;
    b.parent = tempNode; 

    tempNode = a.leftChild;
    a.leftChild = b.leftChild;
    b.leftChild = tempNode;    

    tempNode = a.rightChild;
    a.rightChild = b.rightChild;
    b.rightChild = tempNode;    
}
...