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