如何编写一个接受堆栈和队列的方法?

时间:2011-10-17 17:30:33

标签: java generics methods stack queue

所以我写了这个非常大的方法。如果给它一个堆栈,它将返回一个堆栈。如果给它一个队列,它将返回一个队列。它使用大量递归,并接受队列/堆栈并返回相应的队列/堆栈。

我不想复制/粘贴我的方法,所以我可以更改内部使用的类型,所以有什么方法可以使这个通用?在,它会接受任何旧的收藏和玩它?我尝试使用Collection,但问题是它没有.remove()我可以使用堆栈/队列。

非常感谢任何帮助。

感谢。

5 个答案:

答案 0 :(得分:3)

将您的方法设为私有,并创建两个公共方法:一个采用堆栈,另一个采用队列。让每个方法都转换并返回调用私有方法的结果。这样你就可以避免重复,同时还有特定的方法签名。

答案 1 :(得分:2)

您可以使用Collection,但随后会在删除操作周围进行特殊处理。当然,当你得到一个不是两者之一的系列时,你必须弄清楚要做什么。

if (myCollection instanceof Queue) {
    ((Queue)myCollection).remove();
} else if (myCollection instanceof Stack) {
    ((Stack)myCollection).remove(thingy);
} else {
    // Oops! Now what?
}

答案 2 :(得分:1)

Queue和Stack都有remove()方法,但方法不一样。因此,Java需要知道在编译代码时要调用哪些方法。您需要有两种不同的方法。遗憾

答案 3 :(得分:1)

您需要编写一个具有Stack和Queue所需操作的接口,因为您想在两者上使用递归/操作。

这个新接口将有两个具体的类,它们依赖于下面的Stack和Queue实例,然后多态就会产生魔力。

你可以随时拥有'getUnderlyingCollection()'的方法,这样你就可以在适当的强制转换之后得到实际的Stack或Queue,但是获得多态操作会使你的递归算法更通用。

答案 4 :(得分:0)

我认为你的意思是java.util.Stackjava.util.QueueQueue定义了自己的remove()方法。 Stack继承了java.util.Vector中的remove(...)方法,因此我假设您的意思是pop()

想到两种方式:

  • 提供两个公共方法重载,它们都使用两个参数调用私有方法,其中一个参数始终为null。

  • 使用您需要的常用方法定义一个接口,在两个私有方法的每一个中使用匿名内部类定义(如果它们足够大,则为完整的具体类定义)。

您应该选择哪种方式取决于您需要在内部执行多少丑陋的条件方法调用。 OO-purist更喜欢接口实现。 : - )