Java 如何在出列中查找并返回对象?

Java 如何在出列中查找并返回对象?,java,data-structures,collections,queue,deque,Java,Data Structures,Collections,Queue,Deque,我正在使用一个双端队列(java.util.Dequeue),希望在队列中找到一个对象并返回它 我目前正在使用contains()方法检查队列是否包含对象,但不知道如何获取找到的对象的实际实例。正在搜索的实例不是同一个实例,因为我正在重写equals()方法来测试类变量子集的相等性 如果使用出列无法做到这一点,那么我应该使用什么来代替?我需要将对象推到列表的任意一端,并从一开始就删除它们。显然,我可以搜索一个对象并得到它的实例化。如果你想删除你正在搜索的对象,我不太清楚,但是,一个可能的解决方案

我正在使用一个双端队列(java.util.Dequeue),希望在队列中找到一个对象并返回它

我目前正在使用
contains()
方法检查队列是否包含对象,但不知道如何获取找到的对象的实际实例。正在搜索的实例不是同一个实例,因为我正在重写
equals()
方法来测试类变量子集的相等性


如果使用出列无法做到这一点,那么我应该使用什么来代替?我需要将对象推到列表的任意一端,并从一开始就删除它们。显然,我可以搜索一个对象并得到它的实例化。

如果你想删除你正在搜索的对象,我不太清楚,但是,一个可能的解决方案是获得一个迭代器,然后遍历列表并手动执行相等性检查

Iterator<YourClass> it = yourDeque.iterator();
YourClass foundInstance = null;
while(it.hasNext()) {
    YourClass obj = it.next();
    if(obj.equal(theInstanceYouAreSearchingFor)) {
        foundInstance = obj;
        break;
    }
}
if(foundInstance != null) {
   yourDeque.remove(foundInstance); // if you wish to remove it as well
}
Iterator it=yourDeque.Iterator();
YourClass foundInstance=null;
while(it.hasNext()){
yourclasseobj=it.next();
如果(目标相等(您正在搜索的仪器)){
foundInstance=obj;
打破
}
}
if(foundInstance!=null){
yourDeque.remove(foundInstance);//如果您也想删除它
}

如果要删除正在搜索的对象,我不太清楚,但是,一个可能的解决方案是使用迭代器,然后遍历列表并手动执行相等性检查

Iterator<YourClass> it = yourDeque.iterator();
YourClass foundInstance = null;
while(it.hasNext()) {
    YourClass obj = it.next();
    if(obj.equal(theInstanceYouAreSearchingFor)) {
        foundInstance = obj;
        break;
    }
}
if(foundInstance != null) {
   yourDeque.remove(foundInstance); // if you wish to remove it as well
}
Iterator it=yourDeque.Iterator();
YourClass foundInstance=null;
while(it.hasNext()){
yourclasseobj=it.next();
如果(目标相等(您正在搜索的仪器)){
foundInstance=obj;
打破
}
}
if(foundInstance!=null){
yourDeque.remove(foundInstance);//如果您也想删除它
}

是否可以使用linkedlist?您将获得在任意位置检索元素的方法。

是否可能使用linkedlist?您将获得在任意位置检索元素的方法。

您可以使用
LinkedList
,它实现
Deque
。然后你可以做:

Deque<Object> queue = new LinkedList<>();
// ...
int index = (LinkedList<Object> queue).indexOf(obj);
if (index != -1)
    (LinkedList<Object> queue).get(index);
Deque queue=newlinkedlist();
// ...
int index=(LinkedList队列).indexOf(obj);
如果(索引!=-1)
(LinkedList队列).get(索引);

您可以使用
链接列表
,它实现了
Deque
。然后你可以做:

Deque<Object> queue = new LinkedList<>();
// ...
int index = (LinkedList<Object> queue).indexOf(obj);
if (index != -1)
    (LinkedList<Object> queue).get(index);
Deque queue=newlinkedlist();
// ...
int index=(LinkedList队列).indexOf(obj);
如果(索引!=-1)
(LinkedList队列).get(索引);
(只是为了好玩)

如果您想通过基于索引的迭代(la
for(inti=0;i
)来实现,您需要
E get(intindex)
E remove(intindex)
方法。要实现这一点,
Deque
还必须实现
List
。满足这一点的实现是
LinkedList
。以下是一些hackery的泛型:

import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

import static java.util.Arrays.asList;

public class Main {
    public static void main(String[] args) {
        foo(new LinkedList<>(asList("this", "is", "a", "test")));
        foo(new LinkedList<>(asList(2, 3, 5, 7, 11, 13)));
    }

    public static <E, Delist extends Deque<E> & List<E>> void foo(Delist message) {
        System.out.println(message.get(1) + " " + message.getFirst() + " " + message.get(2) + " " + message.getLast());
    }
}
import java.util.Deque;
导入java.util.LinkedList;
导入java.util.List;
导入静态java.util.Arrays.asList;
公共班机{
公共静态void main(字符串[]args){
foo(新链接列表(asList(“this”、“is”、“a”、“test”));
foo(新的LinkedList(asList(2,3,5,7,11,13));
}
公共静态无效foo(摘牌消息){
System.out.println(message.get(1)+“”+message.getFirst()+“”+message.get(2)+“”+message.getLast());
}
}
(只是为了好玩)

如果您想通过基于索引的迭代(la
for(inti=0;i
)来实现,您需要
E get(intindex)
E remove(intindex)
方法。要实现这一点,
Deque
还必须实现
List
。满足这一点的实现是
LinkedList
。以下是一些hackery的泛型:

import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

import static java.util.Arrays.asList;

public class Main {
    public static void main(String[] args) {
        foo(new LinkedList<>(asList("this", "is", "a", "test")));
        foo(new LinkedList<>(asList(2, 3, 5, 7, 11, 13)));
    }

    public static <E, Delist extends Deque<E> & List<E>> void foo(Delist message) {
        System.out.println(message.get(1) + " " + message.getFirst() + " " + message.get(2) + " " + message.getLast());
    }
}
import java.util.Deque;
导入java.util.LinkedList;
导入java.util.List;
导入静态java.util.Arrays.asList;
公共班机{
公共静态void main(字符串[]args){
foo(新链接列表(asList(“this”、“is”、“a”、“test”));
foo(新的LinkedList(asList(2,3,5,7,11,13));
}
公共静态无效foo(摘牌消息){
System.out.println(message.get(1)+“”+message.getFirst()+“”+message.get(2)+“”+message.getLast());
}
}

只需获取对它的引用即可。如果没有现有的方法,我想我只需要手动迭代。只需要获取对它的引用。如果没有现有的方法,我想我会手动迭代。如果要强制转换到特定的实现,可以先执行
instanceof
检查(并进行一些回退
否则
),或者(对于这种情况更好,我会说),表示
队列
是类型中的
链接列表
(替换
Deque
)。如果要强制转换到特定的实现,请首先执行
instanceof
检查(并进行一些回退
否则
),或者(对于这种情况,我认为更好),表示
队列
是类型中的
链接列表
(替换
Deque
)。