我想在列表中的元素之后添加一个元素,如果列表已经包含该元素,否则我想将这个新元素添加到开头 列表。
以下代码不起作用。
有什么建议吗?
这种方法是否明智地改善了性能?
public class HelloWorld
{
public static void main(String[] args) {
LinkedList<Task> l =new LinkedList<Task>();
l.add(new Task("a"));
l.add(new Task("b"));
l.add(new Task("c"));
int index;
if((index = l.lastIndexOf(new Task("a"))) != -1){
l.add(++index, new Task("5"));
}else{
l.addFirst(new Task("6"));
}
System.out.println(l);
}
}
class Task{
String value;
Task(String v){
value = v;
}
public boolean equals(Task t){
return t.value.equals(this.value);
}
public String toString(){
return this.value;
}
}
输出产生: [6,a,b,c]
预期输出: [a,5,b,c]
答案 0 :(得分:5)
您未在graph explorer
课程中覆盖Object#equals
。
您需要使用Task
对其进行参数化,否则会导致过载。
这反过来又不允许Object
等于new Task("a")
,而是调用new Task("a")
,而引用不匹配。
这反过来会削弱你的Object.equals
调用,带来意想不到的结果。
示例强>
lastIndexOf
如果你正在使用IDE(我推荐),你将拥有允许根据你想要的属性起草@Override
public boolean equals(Object obj) {
// TODO your code, i.e. based on the "value" field
}
(和equals
)实现的功能。
答案 1 :(得分:3)
你的平等应该是这样的。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Task task = (Task) o;
return value != null ? value.equals(task.value) : task.value == null;
}