Java XOR自定义对象

时间:2015-01-16 11:18:06

标签: java algorithm data-structures

我有一个自定义类,我想对它的对象执行XOR操作。

我能想到的唯一方法是将对象序列化为String,然后将字符串转换为bytes数组,然后对其每个元素执行xor操作。然后,在需要时对其进行反序列化。

例如采用List->

的简单情况
class ListNode {
   int val;
   ListNode next;
   ListNode(int val) {this.val = val;}
}

ListNode l1 = new ListNode(2);
ListNode l1 = new ListNode(3);

// ListNode x = l1 ^ l2; 

我想执行l1 XOR l2以实现一些有效的实现,但无法找到一种更简洁的方法来实现它。

有什么建议吗?

修改 在一种算法中,我只有1个指针,但通过使用XOR表示,我可以使用它来存储2个地址。

比方说,例如我的列表是5-> 4-> 3-> 2->>>>> ... 而不是存储5的节点= 4的下一个指针;我想要做的是将previousPointer XOR nextNodePointer存储在节点的下一个字段中。

所以

5's next pointer = NULL XOR 4
4's next pointer = 5 XOR 3..........

因此,在这种情况下,应该保存XOR的结果。 现在可以像这样遍历我们知道null在head之前。 要访问头部(5)的下一个节点4,我们可以执行null XOR nextPointer,所以基本上我们将为每个节点执行此操作

5 next pointer = null XOR 4 as above/
to acess 4 do null XOR (null XOR 4) = 4
now to access 3 do 5 XOR (5 XOR 3) = 5...

所以,我想在某个地方保存这个XOR信息但是我不能创建一个新的列表节点来保存它。 这可以在地址级别以某种方式完成,以便结果与上述操作一致。

3 个答案:

答案 0 :(得分:2)

Java不支持运算符重载,因此您不会拥有ListNode x = l1 ^ l2;。相反,您必须将其定义为方法:ListNode x = ListNode.xor(l1, l2);

为了实现它,你可以迭代节点:

public static ListNode xor(ListNode l1, ListNode l2) {
    ListNode result = new ListNode(l1.val ^ l2.val);
    while (l1.next != null) {
        l1 = l1.next;
        l2 = l2.next;
        result.next = new ListNode(l1.val ^ l2.val);
    }
}

注意:此实现假定l1l2的长度相同。如果不能做出这个假设,那就应该把它作为一个小推文。

答案 1 :(得分:1)

Serialazing两个实例并将它们的表示作为一个字节数组进行xoring是没有意义的(结果甚至不会是这个类的实例的有效表示)。如果你想xor两个intsances的特定字段,那么,只需xor。

答案 2 :(得分:0)

您将无法使用引用执行此操作,因为Java的垃圾收集器依赖于能够直接跟踪引用。您可能会得到引用的整数版本,但是您无法从整数返回到引用,如果您不将引用存储到节点,则该节点将被垃圾回收。

如果需要,您可以将所有节点保存在一个数组中,而不是每个节点都有一个对prev / next节点的引用,它具有prev / next节点的索引。那将允许你做XOR技巧。