繁体   English   中英

两个Java列表元素如何相互访问?

[英]How can two Java list elements access each other?

对我来说,问题的根源是Java不允许引用。

这个问题可以简单地概括。 假设您有一个Blob对象列表:

class Blob {
    public int xpos;
    public int ypos;
    public int mass;
    public boolean dead;
    private List<Object> giganticData;
    public void blobMerge(Blob aBlob) {
        . . .
        if (. . .) {
            this.dead = true;
        } else {
            aBlob.dead = true;
        }
    }
}

如果两个Blob足够接近,则应将它们合并,这意味着要比较的两个Blob中的一个应具有另一个Blob的属性(在这种情况下,应添加质量并合并giganticData集),而另一个应标记为删除从列表中。

撇开如何最佳地识别相邻Blob的问题,一个单独的stackoverflow问题,如何将BlobMerge()逻辑保留在Blob类中? 在C或C ++中,这很简单,因为您可以将一个Blob的指针传递给另一个,而“主机”可以对“来宾”进行任何它喜欢的操作。

但是,上面在Java中实现的blobMerge()将在“来宾” Blob的副本上运行,这有两个问题。 1)无需承担复制giganticData的沉重成本,并且2)“来宾” Blob的原始副本将不受影响。

我只能看到两种方法来做到这一点:

1)传递副本,将所有操作重复两次。 换句话说,Blob A托管Blob B,Blob B托管BlobA。您最终得到了正确的答案,但完成了不必要的工作。

2)将blobMerge()逻辑放入包含包含List的Class中。 但是,当您开始对Blob(BlueBlob,RedBlob,GreenBlob等)进行子类化时,这种方法的伸缩性非常差,以至于每个排列的合并逻辑都不同。 您最终在保存列表的通用容器中获得了大多数特定于子类的代码。

我已经看到了有关通过库将Java引用添加到其中的内容,但是您必须使用库才能使用引用的想法使我偏离了这个想法。

为什么要对副本进行操作? Java将引用传递给对象。 并且引用非常类似于C ++指针。

嗯...传递的不是整个对象的副本。 原始对象将被修改,并且实际上没有数据移动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM