所以我要学习树木,但我决定先学习链接列表。在尝试学习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
答案 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存储节点,节点存储您的数据。每个节点都有next
和previous
。 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;