1

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

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

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

4

4 回答 4

1

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

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
}
于 2013-04-05T13:02:33.253 回答
0

也许使用链表?您将获得在任意位置检索元素的方法。

于 2013-04-05T13:04:37.973 回答
0

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

Deque<Object> queue = new LinkedList<>();
// ...
int index = (LinkedList<Object> queue).indexOf(obj);
if (index != -1)
    (LinkedList<Object> queue).get(index);
于 2013-04-05T13:07:18.267 回答
0

(只是为了好玩)

如果您想通过基于索引的迭代 (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());
    }
}
于 2015-03-18T17:39:04.427 回答