【发布时间】:2017-06-30 15:42:20
【问题描述】:
我正在编写一个代码来保存、删除和加载一个人的身高和体重数据。我创建了 2 个类:
class Person {
private int height;
private int weight;
public Person(int h, int w) {
height = h;
weight = w;
}
public int getHeight() {
return height;
}
public int getWeight() {
return weight;
}
public String getValues() {
return ("Height "+height+" and weight "+weight);
}
}
class DataModified { //Problem in this class
private LinkedList<Person> lList;
private ListIterator<Person> lIter;
public DataModified() {
lList = new LinkedList<Person>();
lIter = lList.listIterator();
}
public void save(Person p) {
Person p1, p2; //p1: Data needed to be saved
p1 = new Person(p.getHeight(), p.getWeight()); //p2: Data already on the list
boolean alreadyExist = false;
lIter = lList.listIterator();
while(lIter.hasNext()) {
p2 = lIter.next();
if ((p2.getHeight() == p1.getHeight()) && (p2.getWeight() == p1.getWeight())) {
alreadyExist = true;
}
}
if(alreadyExist) {
System.out.println("Person: " + p1.getValues() + " had already been on the list.");
}
else {
lIter.add(p1);
System.out.println("Person: " + p1.getValues() + " is added to the list.");
}
}
public void delete(Person p) {
Person p3, p2; //p3: Data needed to be deleted
p3 = new Person(p.getHeight(), p.getWeight());
boolean alreadyExist = false;
lIter = lList.listIterator();
while(lIter.hasNext()) {
p2 = lIter.next();
if ((p2.getHeight() == p3.getHeight()) && (p2.getWeight() == p3.getWeight())) {
alreadyExist = true;
}
}
if(alreadyExist) {
lIter.remove();
System.out.println("Person: " + p3.getValues() + " is deleted from the list.");
}
else {
System.out.println("Person: " + p3.getValues() + " is not on the list.");
}
}
public void load() { //Problem
lIter = lList.listIterator();
Person p2;
for(int i = 1; lIter.hasNext(); i++){
p2 = lIter.next();
System.out.println("Person "+i+" has "+p2.getValues());
}
}
}
我已经从DataModified 类中测试了这 3 种方法:我首先保存 3 个人的数据,然后删除 1 个人并加载其余的人。但是,最后一种方法打印的不是列表中的 2 个人,而是我之前删除的那个人。
我的问题是:
- 我的代码有什么问题?为什么
load()方法会这样工作? - 注意到迭代后只能修改
lIter。那么lList和lIter是同一个列表还是两个单独的列表?如果它们不一样,我该如何给lList来自lIter的数据? - 有没有办法停止列表的迭代?
【问题讨论】:
-
你应该使用
.equals()来设置alreadyExist -
在
delete(),一旦你找到你的Person,你在第一次找到某人并继续前进时将alreadyExist设置为true。因此,一旦设置好,它就会为每个人设置。如果您在位置 1 的列表中找到您的 Person,您将删除他,但随后您将删除下一个人,依此类推。你所有的while循环都需要说while (lIter.hasNext() && !alreadyExists) -
您设计方法的方式存在太多问题。正如@River 所提到的,为您的 Person 类覆盖 equals 和 hashcode 并使用它来检查 LinkedList 中已经存在的案例。在删除方法中,您使用 remove() 没有任何参数。它只会删除链表的头部,而不是您要删除的 Person p。如果您覆盖 equals,您将能够使用 remove(Object o) 方法。
-
不相关:你为什么有
ListIterator作为一个字段?摆脱它,并在需要的地方声明为局部变量。
标签: java linked-list listiterator