2012-03-27 54 views
0

我有两个类:如何删除对象?

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 

,在节目中,有时我们添加一些新的节点,然后我们必须添加它们之间的链接,我可以用与上面相同的方式来做到这一点,我的问题是: 如果我想删除节点,我必须做些什么? (这点和其他现有节点之间的链接也必须被删除)

回答

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[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,那么它将不会被垃圾收集。这意味着从现场Thread s不再可到达的Object的环和网格将被大量收集。

+0

我认为这个问题的意图是“我们如何找到包含节点的所有链接”。当它建立时,我认为唯一的答案是线性搜索。 – jpm 2012-03-27 15:12:46

+0

@jpm感谢您的观察,只是为了更新这篇文章。 – 2012-03-27 15:21:00

0

“删除”Java中的对象意味着删除所有指向该对象的引用。垃圾收集器最终将释放该对象占用的内存。所以你需要做的是将所有对特定节点对象的引用设置为null

// lets delete node1 
link[1].node1 = null; 
node1 = null; 

// at some point the object will be deleted 
1

删除节点之前;在您的链接上循环并删除任何将您的节点删除为node1或node2的节点,然后删除您的节点。

1

您可能想要探索一个比数组更好的数据结构,用于此用例。您希望能够检查所有链接,找出哪些链接指向已删除的节点,并删除这些链接。开始查看List/Set,看看它们是否适合您的需求,并慢慢演变为一个良好的实施,为您提供所需的。