2012-03-27 90 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,看看它們是否適合您的需求,並慢慢演變爲一個良好的實施,爲您提供所需的。