Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定指针,从LinkedList集合中删除元素_Java_Collections_Linked List_Doubly Linked List - Fatal编程技术网

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条件)