2011-10-17 31 views
3

所以我有这个我写的非常大的方法。如果它被给了一个堆栈,它将返回一个堆栈。如果它被给予一个队列,它将返回一个队列。它使用了很多递归,并且它接受一个队列/堆栈并返回相应的相同队列/堆栈。如何编写接受堆栈和队列的方法?

我不想复制/粘贴我的方法,所以我可以改变里面使用的类型,所以有什么办法可以使这个通用?如同,它会接受任何旧收藏品并与之一起玩耍?我尝试过使用Collection,但麻烦的是它没有.remove()我可以使用堆栈/队列。

任何帮助将不胜感激。

谢谢。

+1

请注意,Stack的Javadoc指出Deque是更可取的。如果可能,您可能会完全忽略Stack。 – Puce

回答

2

你可以使用Collection,但是在你的删除操作周围有特殊情况处理。当然,当你得到一个不属于二者之一的集合时,你必须弄清楚该怎么做。

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

您可以在内部实现此功能,但限制公共API只允许您传入队列或堆栈。 –

+0

非常感谢goto10以及其他所有回答问题的人。这最终为我的目的完美工作。我只是把它放到一个方法中,然后再插入一个,它在泛型集合上工作得很好。一个小细节,它是instanceof,而不是instanceOf(即O不是大写)。再次感谢。 –

+0

我很高兴它为你工作,我已经修复了我的错误。 – goto10

3

使您的方法变为私有方法,并创建两个公共方法:一个使用堆栈,另一个使用队列。让这些方法中的每一个都投射并返回调用私有方法的结果。这样你可以避免重复,同时仍然有特定的方法签名。

+0

+1正是我想说的。 –

+0

麻烦的是私有方法现在只接受堆栈,我想知道如何让它接受队列,并在它上面调用.remove()和.add(),因为两者都是队列和堆栈在Java中有这些方法。基本上,这种大型方法应该接受我能够给它堆栈和队列的类型,以及我需要在这些堆栈和队列上使用哪些类型? –

+0

@ user999674:这很大程度上取决于您的方法实际执行的操作。由于队列和堆栈针对不同的动作进行了优化,因此您可能希望将输入限制为一个或另一个,或者甚至只是要求提供'List'。您也可以将非特定逻辑抽象为另一种方法,并将其传递给某种知道如何在基础项目上添加和移除项目的包装器。可能性非常大,你没有提供足够的信息给你一个很好的答案。我只是回答了最初提出的问题。 – StriplingWarrior

1

队列和堆栈都有一个remove()方法,但方法不一样。因此,Java在编译代码时需要知道哪些方法需要调用。你将需要有2个独立的方法。对不起

1

您需要编写一个接口,该接口具有您需要从堆栈和队列中进行的操作,因为您希望对两者都使用递归/操作。

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

你可以总是有一个'getUnderlyingCollection()'的方法,这样你可以在正确的转换后得到实际的堆栈或队列,但是达到多态操作会使你的递归算法更通用。

0

我假设你的意思是java.util.Stackjava.util.QueueQueue定义了自己的remove()方法。 Stackjava.util.Vector继承了其remove(...)方法,所以我假设你实际上是指pop()

两种方式映入脑海:

  • 提供两个公共方法重载这两个调用一个私有方法有两个参数,其中一个总是空。

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

您应该选择哪一个取决于您需要在内部执行多少个丑陋的条件方法调用。无论如何,OO纯粹主义者更喜欢接口实现。 :-)