我有两个班级:
Class Node {
int address
}
Class Link{
int latency;
int bandwidth;
Node node1;
Node node2;
}
public Link [] link= new Link[Nmax];
如果我想在两个节点之间创建一个链接,那很简单,我只想:
node1=new Node(); //and then I add parameter like address and so on
node2= new Node();//...............
link[1]= new Link();
link[1].node1=node1;
link[1].node2=node2;
link[1].latency=15; //and so on, we suppose that we have 100 nodes and 60 links
现在,在程序期间,有时我们添加一些新节点然后我们必须在它们之间添加链接,我可以用上面相同的方式做到这一点,我的问题是: 如果我想删除节点,我该怎么办? (此节点与其他现有节点之间的链接也必须删除)
答案 0 :(得分:2)
---为了回应jpm的出色观察而编辑---
在您的情况下,您自己正在进行所有数据结构管理,但是没有存储足够的信息来撤消对数据结构的添加。
您需要在创建时存储足够的信息以支持数据结构上的其他操作。这意味着可能选择数组作为高级公开数据结构是一个糟糕的选择,因为无法保证添加将保留足够的信息来支持删除。
将数组包装在对象中,并使用add(...)
方法编写代码以支持有效删除。这可能意味着存储更多信息,这些信息是专门为支持删除而构建的。
---原帖如下---
要删除Java中的对象,请确保没有任何“指向”它(具有对它的引用)然后等待。自动垃圾收集将为您进行删除。
一个明确的例子
link[1] = new Link();
// now we have an extra Link in our array
link[1] = null;
// now garbage collection will delete the recently added Link object.
请注意,如果您对创建的Link对象有两个或三个引用,则在所有引用都丢失之前不会收集它
link[1] = new Link();
// now we have an extra Link in our array
Link current = link[1];
// now we have two references to the newly created Link
link[1] = null;
// now we have one reference to the newly created Link
current = null;
// now the newly created Link is a candidate for garbage collection
实现此方法的方法是用户实现的程序的顶级Thread
。如果该线程可以到达有问题的Object
那么它将不会被垃圾收集。这意味着无法再从实时Object
访问的Thread
s的环和网格将被大量收集。
答案 1 :(得分:1)
删除节点之前;循环链接并删除任何将节点作为node1或node2删除的节点,然后删除节点。
答案 2 :(得分:1)
对于此用例,您可能希望探索使用比数组更好的数据结构。您希望能够检查所有链接,找出哪些链接引用已删除的节点,并删除这些链接。开始查看List / Set并查看它们是否符合您的需求,然后慢慢演变成一个能够满足您需求的良好实现。
答案 3 :(得分:0)
“删除”Java中的对象意味着删除指向该对象的所有引用。然后垃圾收集器最终将释放该对象占用的内存。因此,您需要做的是将对特定Node对象的所有引用设置为null
。
// lets delete node1
link[1].node1 = null;
node1 = null;
// at some point the object will be deleted