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

How to remove ints from LinkedList pp = new LinkedList();?

所以我打算学习树,但我决定先学习链表。在尝试学习 LinkedList 时,我发现了一个作业,要求我创建一个链表,人们去酒吧(有年龄),然后把 18 岁以下的人赶出去。

我在从链接列表中删除人员时遇到了很大的问题。我能找到的每个教程都在使用节点,而我只对使用 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

如果你想在遍历列表的同时修改它,你会遇到问题,因为索引突然出错了。去掉一个人,下一个人没有索引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
    }
}

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

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

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

一个链表存储节点,节点存储你的数据。每个节点都有一个 next 和一个 previous。 LinkedList 本身只存储其中的 2 个节点,第一个 (Head) 和最后一个 (Tail)。

LinkedList 不能像数组一样"freely" 访问,如果你有一个大小为 500 的 LinkedList,并且你想访问第 125 个元素,这将花费你 time.Basicaly 你必须转到头部并执行 125 "nexts" 直到你到达你的元素。现在这只是 get 部分,如果你想做

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

所以你必须循环 "getting the next" i 次,在你 return 之后,下一个 get 仍然需要,再次 "getting the next" i 次。删除也是如此,为了删除 LinkedList 上的内容,您必须首先到达该节点,因此再次到达 remove(i) 您将需要 "getting the next" i 次。

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

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

A-B-C-D-E

而你想删除 C,会发生什么

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