我正在使用一个双端队列(java.util.Dequeue)并且想在队列中找到一个对象并返回它。
我目前正在使用该contains()
方法检查队列是否包含对象,但不知道如何获取找到的对象的实际实例。正在搜索的实例不是同一个实例,因为我正在重写该equals()
方法来测试类变量子集的相等性。
如果使用 Dequeue 无法做到这一点,那么我应该使用什么来代替?我需要将对象推送到列表的任一端并从一开始就将它们删除。并且显然能够搜索一个对象并获得它的实例化。
我正在使用一个双端队列(java.util.Dequeue)并且想在队列中找到一个对象并返回它。
我目前正在使用该contains()
方法检查队列是否包含对象,但不知道如何获取找到的对象的实际实例。正在搜索的实例不是同一个实例,因为我正在重写该equals()
方法来测试类变量子集的相等性。
如果使用 Dequeue 无法做到这一点,那么我应该使用什么来代替?我需要将对象推送到列表的任一端并从一开始就将它们删除。并且显然能够搜索一个对象并获得它的实例化。
如果你想删除你正在搜索的对象,我有点不清楚,但是,一种可能的解决方案是获取一个迭代器,然后迭代列表并手动进行相等性检查。
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
}
也许使用链表?您将获得在任意位置检索元素的方法。
您可以使用LinkedList
,它实现Deque
. 然后你可以这样做:
Deque<Object> queue = new LinkedList<>();
// ...
int index = (LinkedList<Object> queue).indexOf(obj);
if (index != -1)
(LinkedList<Object> queue).get(index);
(只是为了好玩)
如果您想通过基于索引的迭代 (a la for(int i = 0; i < n; i++)
) 来实现,则需要E get(int index)
和E remove(int index)
方法。要做到这一点,Deque
还必须实施List
. 满足这一点的实现是LinkedList
. 这是一些泛型黑客:
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());
}
}