Java 给定指针,从LinkedList集合中删除元素
我有一组对象,还有一个指向Java 给定指针,从LinkedList集合中删除元素,java,collections,linked-list,doubly-linked-list,Java,Collections,Linked List,Doubly Linked List,我有一组对象,还有一个指向LinkedList对象的指针,我想删除该对象 有一种方法可以用来删除一个对象,但正如文档所描述的,它逐个检查所有元素,并选择一个语义相同的对象 但是这种方法不符合我的要求 由于我有一个指向要删除的对象的指针,我应该能够在O(1)时间内删除它,因为LinkedList是一个双链接列表在不实现我自己的LinkedList类的情况下,是否有其他方法可以实现此目的?如何: public void remove(Car searchedFor) { for (Iterato
LinkedList
对象的指针,我想删除该对象
有一种方法可以用来删除一个对象,但正如文档所描述的,它逐个检查所有元素,并选择一个语义相同的对象
但是这种方法不符合我的要求
由于我有一个指向要删除的对象的指针,我应该能够在O(1)
时间内删除它,因为LinkedList
是一个双链接列表在不实现我自己的LinkedList
类的情况下,是否有其他方法可以实现此目的?如何:
public void remove(Car searchedFor) {
for (Iterator<Car> it = list.iterator(); it.hasNext(); ) {
Car c = it.next;
if (c == searchedFor) {
it.remove();
}
}
}
public void remove(搜索汽车){
for(Iterator it=list.Iterator();it.hasNext();){
车c=it.next;
如果(c==searchedFor){
it.remove();
}
}
}
那么:
public void remove(Car searchedFor) {
for (Iterator<Car> it = list.iterator(); it.hasNext(); ) {
Car c = it.next;
if (c == searchedFor) {
it.remove();
}
}
}
public void remove(搜索汽车){
for(Iterator it=list.Iterator();it.hasNext();){
车c=it.next;
如果(c==searchedFor){
it.remove();
}
}
}
如果只有对对象本身的引用,则无法从O(1)中的链接列表中删除对象
如果通过调用迭代器将ListIterator
对象放置在要删除的项上,则可以删除对象,但这没有多大帮助,因为在修改列表时,迭代器将失效
下面是一个如何保持O(1)移除的示例。搜索仍然为O(n),但:
List List=newlinkedlist();
添加(“你好”);
列表。添加(“世界”);
列表。添加(“一”);
列表。添加(“两个”);
列表。添加(“三”);
System.out.println(Arrays.toString(list.toArray());
ListIterator iter=list.ListIterator();
字符串s;
而((s=iter.next())!=null&&!s.equals(“世界”))
;
//何时该删除
iter.remove();
System.out.println(Arrays.toString(list.toArray());
由于ConcurrentModificationException
,编写自己的LinkedList
实现并保留对节点的引用以供将来删除仍然是纯链接列表的最佳选择
您的另一个选项是使用LinkedHashSet
,它提供可预测的枚举顺序和O(1)删除,以换取使用更多内存。如果只有对对象本身的引用,则无法从O(1)中的LinkedList
中删除对象
如果通过调用迭代器将ListIterator
对象放置在要删除的项上,则可以删除对象,但这没有多大帮助,因为在修改列表时,迭代器将失效
下面是一个如何保持O(1)移除的示例。搜索仍然为O(n),但:
List List=newlinkedlist();
添加(“你好”);
列表。添加(“世界”);
列表。添加(“一”);
列表。添加(“两个”);
列表。添加(“三”);
System.out.println(Arrays.toString(list.toArray());
ListIterator iter=list.ListIterator();
字符串s;
而((s=iter.next())!=null&&!s.equals(“世界”))
;
//何时该删除
iter.remove();
System.out.println(Arrays.toString(list.toArray());
由于ConcurrentModificationException
,编写自己的LinkedList
实现并保留对节点的引用以供将来删除仍然是纯链接列表的最佳选择
您的另一个选择是使用LinkedHashSet
,它提供了可预测的枚举顺序和O(1)删除,以换取使用更多内存。我的问题的一个很好的解决方案是同时使用List
和HashSet
。由于我们使用的是哈希集
,因此无法处理重复项
插入:同时插入列表
和哈希集
<代码>O(1)
时间。删除:从
HashSet
中删除(如果存在)<代码>O(1)时间。遍历:遍历
列表
。仅当HashSet
包含该对象时才访问
请注意,我并不是试图在这里复制
LinkedList
的工作。我只是在分享对我有用的东西。解决我问题的一个好办法是同时使用List
和HashSet
。由于我们使用的是哈希集
,因此无法处理重复项
插入:同时插入列表
和哈希集
<代码>O(1)时间。删除:从
HashSet
中删除(如果存在)<代码>O(1)时间。遍历:遍历
列表
。仅当HashSet
包含该对象时才访问
请注意,我并不是试图在这里复制
LinkedList
的工作。我只是在分享对我有用的东西。Java中的“指针”被称为“引用”。@dasblinkenlight尽管我同意,但Java似乎对这个论点没有帮助,因为甚至还有一个称为“NullPointerException”的异常。“NullReferenceException”当然更好;-)。你能给我们看一下你的代码吗?如果你使用的是Java8+,你可以使用linkedList.removeIf(e->some\u条件)使用该解决方案,它将删除集合中满足给定谓词的所有元素。不仅仅是前面提到的remove
方法所做的第一步。Java中的“指针”称为“引用”。@dasblinkenlight尽管我同意,但Java似乎对这个论点没有帮助,因为甚至还有一个称为“NullPointerException”的异常。“NullReferenceException”当然更好;-)。你能给我们看一下你的代码吗?如果你使用的是Java8+,你可以使用linkedList.removeIf(e->some\u条件)使用该解决方案,它将删除集合中满足给定谓词的所有元素。