2015-07-20 58 views
0

所以我要去學習樹木,但我決定先學習鏈接列表。在試圖學習LinkedList時,我發現一個任務,希望我創建一個鏈表,人們去酒吧(年齡),並拋出誰是18歲以下的人。如何從LinkedList中刪除ints pp = new LinkedList();?

我有很大的問題,我的鏈接列表。 Everytutorial我可以找到使用節點,而我只是有興趣使用LinkedList(something)= new LinkedList();

因此,例如,pp.next();不適合我。

輸出方式:

有一個人的年齡(數量)在線。

這我多麼希望該程序的工作:

我打印出來: 有年齡(數字)一個人行。 我刪除了18歲以下的人(我想在removeAlder方法中刪除它)。 我再次打印出來: 有一個年齡段的人(號碼)在線(每個18歲以下的人被刪除)。

這是我的代碼。

package polkø; 


import java.util.*; 
public class Polkø { 

    public static void main(String[] args) { 

     Random generator = new Random(); 
     int folk = generator.nextInt(60); 
     folk = folk + 15; 
     personer objekt = new personer(folk); 
     objekt.getAlder(); 

     } 



    } 






package polkø; 

import java.util.*; 

    public class personer { 
    LinkedList pp = new LinkedList(); 
    Random generator2 = new Random(); 


    personer(int folk){ 
    for (int i = 1; i < folk; i++){ 
     int alder = generator2.nextInt(50); 
     alder = alder + 10; 
     pp.add(alder); 
    } 

    } 

    public void getAlder(){ 
    for (int i = 1; i < pp.size(); i++){ 
    System.out.print("Det står en person i køen som er: "); 
     System.out.print(pp.get(i)); 
     System.out.println(" År gammel"); 

} 
    } 

    public void removeAlder(){ 
    for (int i = 1; i < pp.size(); i++){ 

     //I need something simple here that can remove the people under 18. 

     } 

    } 
} 

這是打印出來,到目前爲止:

Det står en person i køen som er: 30 År gammel 
Det står en person i køen som er: 33 År gammel 
Det står en person i køen som er: 13 År gammel 
Det står en person i køen som er: 37 År gammel 
Det står en person i køen som er: 33 År gammel 
Det står en person i køen som er: 45 År gammel 
Det står en person i køen som er: 15 År gammel 
Det står en person i køen som er: 54 År gammel 
Det står en person i køen som er: 20 År gammel 
Det står en person i køen som er: 46 År gammel 
Det står en person i køen som er: 20 År gammel 
Det står en person i køen som er: 10 År gammel 
Det står en person i køen som er: 38 År gammel 
Det står en person i køen som er: 54 År gammel 
Det står en person i køen som er: 31 År gammel 
Det står en person i køen som er: 18 År gammel 
Det står en person i køen som er: 10 År gammel 
Det står en person i køen som er: 16 År gammel 
Det står en person i køen som er: 43 År gammel 
Det står en person i køen som er: 53 År gammel 
Det står en person i køen som er: 38 År gammel 
Det står en person i køen som er: 43 År gammel 
Det står en person i køen som er: 33 År gammel 
Det står en person i køen som er: 15 År gammel 
Det står en person i køen som er: 34 År gammel 
Det står en person i køen som er: 53 År gammel 
Det står en person i køen som er: 38 År gammel 
Det står en person i køen som er: 59 År gammel 
Det står en person i køen som er: 28 År gammel 
Det står en person i køen som er: 32 År gammel 
Det står en person i køen som er: 33 År gammel 
+0

你能更清楚地解釋你的問題?你的輸出不是很有用,因爲大多數人都無法理解它。 – Karthik

+0

現在來看看。我編輯過。我想讓我的程序做3件事。第1步。列出鏈接列表中的人員(它所做的)。 2.刪除18歲以下的人。打印出相同的行,但沒有18歲以下的人。我無法在網上找到一個教程,因爲沒有人使用LinkedList(something)= new LinkedList(); –

+0

你爲什麼用'singly-linked-list'標記這個?一個'java.util.LinkedList'是雙向鏈接的;考慮到這個問題,如果它是雙重或單一鏈接似乎是無關緊要的,所以不需要標記它。 –

回答

2

如果你想同時遍歷它來修改的列表,你會跌入問題,因爲該指數突然是錯誤的。如果你移除一個人,下一個人沒有索引i + 1,但突然i。

例如:

您是在I = 20,人12.你將其刪除。突然間,名單縮短了,如果你繼續在21歲,你會忽略20歲的人(之前是21歲)。

解決方案:使用迭代器。

Iterator<Integer> iterator = pp.iterator(); 
while(iterator.hasNext()) { 
    Integer age = iterator.next(); 
    if (... your test here) { 
     iterator.remove(); // This removes the age from the list AND takes care of updating it, so that the next next() call will work correctly 
    } 
} 

哦,順便說一句:類是大寫。它是永遠不會早期產生好的代碼,而不是隻是工作代碼;-)

+0

我明白我的想法。我沒有寫過一句話,把所有的人都移走了嗎?或者是因爲他們被鏈接,我不能這樣做,因爲它會失去參考?另外,我現在要開始閱讀itorator,但是我可以在數組中使用它嗎?我討厭刪除數組中的元素。 –

+0

我真的不明白你的問題,對不起。如果你想刪除所有年齡小於18歲的人,你沒有太多的選擇,只是用循環遍歷整個列表。至於數組,我建議先將值放入一個List('new ArrayList (Arrays.asList(myArray));'),清理列表然後檢索結果數組('toArray' ...)。 –

0

嘿,我只是想解決這裏說的一些東西,並不完全是真實的,首先,你可以刪除一些for循環,而不使用一個迭代器,但你不應該這樣做。

爲什麼?首先,我們需要了解LinkedList是什麼。

LinkedList存儲節點,節點存儲您的數據。每個節點都有一個next和一個previous。 LinkedList本身只存儲這些點頭中的2個,第一個(頭部)和最後一個(尾部)。

LinkedList不能像數組一樣「自由」地訪問,如果你有一個LinkedList的大小爲500,並且你想訪問第125個元素,這將花費你的時間。基本上你必須去頭和做125個「下一個」,直到你達到你的要素。現在,這只是爲get的一部分,如果你會做類似

if(pp.get(i)<18) 
    pp.remove(i); 

所以,你必須在一個循環「讓下一個」 i次,返回,未來GET仍然需要,再之後,「獲得下一個「i次。刪除也是一樣,爲了刪除LinkedList上的某些內容,您必須首先到達該節點,然後再到remove(i),您需要「獲取下一個」i次。

在另一方面,迭代過程中返回的最後一個節點被保存,下次是含量的不同(你只需做一次)刪除不浪費任何時間到達那裏。

你似乎也弄不清LinkedList的去除,這是不一樣的陣列。只是一個簡單的例子,以幫助您更好地瞭解,

A-B-C-D-E 

,並要刪除C,會發生什麼情況是

B.NEXT = D 
D.PREVIOUS = B 
C.NEXT = null; 
C.PREVIOUS = null;