Как написать метод, который принимает стеки и очереди? - PullRequest
3 голосов
/ 17 октября 2011

Итак, у меня есть этот действительно большой метод, который я написал.Если ему дан стек, он вернет стек.Если ему дана очередь, она вернет очередь.Он использует много рекурсии, и он принимает очередь / стек и возвращает ту же самую очередь / стек, измененную соответствующим образом.

Я не хочу копировать / вставлять свой метод только для того, чтобы я мог изменить тип, используемый внутриТак есть ли способ сделать это универсальным?Как, он будет принимать любую старую коллекцию и играть с ней?Я пробовал просто использовать Collection, но проблема в том, что у него нет .remove (), который я могу использовать со стеком / очередью.

Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 17 октября 2011

Сделайте ваш метод приватным и создайте два открытых метода: один, который принимает стек, и другой, который занимает очередь. пусть каждый из этих методов приведен и возвращает результат вызова закрытого метода. Таким образом вы избежите повторения, сохраняя при этом определенные сигнатуры методов.

2 голосов
/ 17 октября 2011

Вы можете использовать Collection, но затем иметь специальную обработку всего процесса удаления.Конечно, вам придется выяснить, что делать, когда вы получите коллекцию, которая не является одной из двух.

if (myCollection instanceof Queue) {
    ((Queue)myCollection).remove();
} else if (myCollection instanceof Stack) {
    ((Stack)myCollection).remove(thingy);
} else {
    // Oops! Now what?
}
1 голос
/ 17 октября 2011

Вам нужно написать интерфейс, в котором есть необходимые операции как из стека, так и из очереди, поскольку вы хотите использовать рекурсию / операции для обоих.

Этот новый интерфейс будет иметь два конкретных класса, которые будут полагаться на экземпляры Stack и Queue внизу, тогда полиморфизм станет магией.

У вас всегда может быть метод для getUnderlyingCollection (), чтобы вы могли иметь реальный стек или очередь после правильного приведения, но достижение полиморфных операций сделает ваш рекурсивный алгоритм более универсальным.

1 голос
/ 17 октября 2011

У очереди и стека есть метод remove (), но этот метод не одинаков. Из-за этого Java должна знать, какой из этих методов вызывать при компиляции кода. Вам нужно будет иметь 2 отдельных метода. К сожалению

0 голосов
/ 17 октября 2011

Полагаю, вы имеете в виду java.util.Stack и java.util.Queue.Queue определяет свой собственный метод remove().Stack наследует свои remove(...) методы от java.util.Vector, поэтому я предполагаю, что вы на самом деле имеете в виду pop()?

На ум приходят два способа:

  • Обеспечивает две открытые перегрузки метода, которые оба вызывают закрытый метод с двумя параметрами, один из которых всегда равен нулю.

  • Определение интерфейса с помощью общейнеобходимые вам методы, с анонимным определением внутреннего класса в каждом из двух частных методов (или полными конкретными определениями классов, если они достаточно велики).

То, что вы должны выбрать, зависит от того, какмногие уродливые вызовы условных методов, которые вам нужно будет сделать внутри.ОО-пурист предпочел бы реализацию интерфейса независимо.: -)

...