如何在Java中交换2个对象的字段?

时间:2018-12-01 18:55:45

标签: java object reference swap

我有两个TreeNode类的对象。这些字段称为a和b,其中包含以下字段:

value
index
parent
leftChild 
rightChild

我想创建一个函数

swap(a,b)

将a的字段交换为b的字段,反之亦然。

我试图创建这样的函数,但是它很长而且效率很低,因为值没有按预期更改。 有任何简单的方法吗?

3 个答案:

答案 0 :(得分:1)

我认为字段的类型是:

  • 值是字符串
  • 索引为整数
  • 父母是TreeNode
  • leftChild是TreeNode
  • rightChild是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;    
}

答案 1 :(得分:0)

将值从b复制到临时变量,将值从a设置为b,将值从临时变量复制到a。就是这样。

答案 2 :(得分:0)

在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);

您有两个变量ab,它们分别引用一个TreeNode实例(我将其称为aTreeNodebTreeNode,只是给它们命名为I可以谈谈)。这些实例在其字段中具有不同的值。让我们描述一下:

    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)的方法,则该方法将获取对aTreeNodebTreeNode实例的引用。由于该方法不知道这些引用的来源(在我们的例子中为变量ab,但也可能是数组元素或其他方法调用的结果),最好的办法是在这些实例中交换内容:

    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