这不是我在现实生活中会做的事情,而是说:
LinkedList = a,b,c,d,e
我得到了相应的索引。
说,我想删除b (index=1) and d (index=3)
(即c (index=j=2)
周围的值)
现在,我做(工作正常):
When j=2
LS.remove(j + 1); ----> j=3 (d removed)
LS.remove(j - 1); ----> j=1 (b removed)
b and d
已删除。
但如果,我这样做(不起作用):
When j=2
LS.remove(j - 1); ----> j=1 (b removed)
LS.remove(j); ----> j=2 (d is not removed) (used j because due to above removal, LL has adjusted it self)
即。当我首先移动'c'之前的值时,'d'不会被移除,并且LL保持不变。我想,我也在做同样的事情。
我错过了什么吗?
更新
因此,当我更改签名public void operation(String operator, Integer j) to public void operation(String operator, int j)
时,它就有用了。
答案 0 :(得分:5)
如果j
类型为大Integer
,则会调用LinkedList.remove(Object)
而不是LinkedList.remove(int)
。这不是你真正想要的。
我没有看到任何理由在第二个示例中使用big-Integer作为j
的类型,您应该使用原始int
。
请检查Why aren't Java Collections remove methods generic? LinkedList
仍有remove(Object)
签名的原因。
答案 1 :(得分:2)
当您修改列表时,通过索引引用列表元素是一种毛茸茸的事情 - 因此索引与元素之间的关系正在发生变化。这就是为什么在Java中,java.util.List
有一个方法List.listIterator()
,给出java.util.ListIterator
。有了这个,你可以写一个像这样的方法:
void removeAdjacent(List<?> list, Object o) {
ListIterator<?> listIt = list.listIterator();
while (listIt.hasNext()) {
if (listIt.next().equals(o)) {
// set the iterator back to the element we just checked
listIt.previous();
// remove previous if it exists
// and set the iterator again to this element
if (listIt.hasPrevious()) {
listIt.previous();
listIt.remove();
listIt.next();
}
// remove next if it exists
if (listIt.hasNext()) {
listIt.next();
listIt.remove();
}
}
}
}
答案 2 :(得分:1)
你错过了什么。这个完整的程序产生了预期的结果:
import java.util.LinkedList;
public class Foo {
public static void main(String []argv) {
LinkedList<String> l = new LinkedList<String>();
l.add("a");
l.add("b");
l.add("c");
l.add("d");
l.add("e");
int j = 2;
l.remove(j - 1);
l.remove(j);
System.out.println(l.toString());
}
}
结果是:
[a, c, e]