如何从LinkedList中删除整数pp = new LinkedList();?

时间:2015-07-20 13:51:49

标签: java singly-linked-list

所以我要学习树木,但我决定先学习链接列表。在尝试学习LinkedList时,我发现了一项要求我创建链接列表的作业,人们去了酒吧(有了年龄),并且扔掉了18岁以下的人。

从链接列表中删除人员时遇到很大问题。我能找到的Everytutorial是使用节点,而我只对使用LinkedList(某事)= 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

2 个答案:

答案 0 :(得分: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
    }
}

哦,顺便说一句:类是大写的。制作好的代码而不仅仅是工作代码永远不会太早; - )

答案 1 :(得分:0)

嘿,我只是想解决这里所说的一些事情并不完全正确,首先你可以在不使用迭代器的情况下删除for循环中的东西,但你不应该这样做。

为什么呢?首先,我们需要了解LinkedList是什么。

LinkedList存储节点,节点存储您的数据。每个节点都有nextprevious。 LinkedList本身只存储其中的两个点头,第一个(头部)和最后一个(尾部)。

LinkedList无法自由地#34;像数组一样访问,如果你有一个大小为500的LinkedList,并且你想要访问第125个元素,这将花费你的时间。基本上,你必须去头部做125&#34; nexts&#34;直到你到达你的元素。现在,如果您要执行类似

的操作,这仅适用于get部分
if(pp.get(i)<18)
    pp.remove(i);

所以你需要一个循环&#34;得到下一个&#34; i次,在您返回之后,下一次获取仍然需要,再次,&#34;获得下一个&#34; i次。删除也是如此,为了删除LinkedList上的内容,您必须首先到达该节点,然后再次remove(i),您将需要&#34;获取下一个&#34; i次。{/ p>

另一方面,在迭代过程中,最后一个节点被保存,下一个节点被保存(你只需要这样做一次),删除并不会浪费任何时间到达那里。

您似乎对LinkedList中的删除感到困惑,它与数组中的删除不同。只是一个帮助您更好理解的简单示例,

A-B-C-D-E

你要删除C,会发生什么

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