Можно ли использовать предоставляемые методы коллекций Java, такие как max, min, sort, ect ..., в стеке? - PullRequest
0 голосов
/ 17 декабря 2018

Я работал над проблемой стеков на HackerRank ( См. Здесь ).В одной из частей вопроса задается максимальное значение в стеке.Я думал, что простой способ сделать это - написать расширенный класс Stack с помощью метода max () (см. Ниже).Это сработало, но я подумал, что еще более простым способом может быть использование методов коллекций Java.Поэтому я создал метод craftyMax () (также показанный ниже).

class MyStack<T> extends Stack<T> {
    public T craftyMax() {
        return Collections.max(this);
    }

    public T max() {
        Integer max = Integer.MIN_VALUE;

        for (T item: this) {
            max = Math.max((Integer)item, max);
        }

        return (T) max;
    }
}

Конечно, это не сработало, так как компилятор ответил:

Solution.java:6: error: no suitable method found for max(MyStack<T#1>)
        return Collections.max(this);
                          ^
    method Collections.<T#2>max(Collection<? extends T#2>) is not applicable
      (inferred type does not conform to upper bound(s)
        inferred: T#1
        upper bound(s): Comparable<? super T#1>,Object)
    method Collections.<T#3>max(Collection<? extends T#3>,Comparator<? super T#3>) is not applicable
      (cannot infer type-variable(s) T#3
        (actual and formal argument lists differ in length))
  where T#1,T#2,T#3 are type-variables:
    T#1 extends Object declared in class MyStack
    T#2 extends Object,Comparable<? super T#2> declared in method <T#2>max(Collection<? extends T#2>)
    T#3 extends Object declared in method <T#3>max(Collection<? extends T#3>,Comparator<? super T#3>)
Note: Solution.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

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

Можно ли использовать предоставляемые методы коллекций Java, такие как max, min, sort, ect ..., в / внутри стека?Или я ожидаю немного слишком много?

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Вы можете вызывать Collections.max только с одним аргументом для типов, которые реализуют интерфейс Comparable.Измените объявление типа на

class MyStack<T extends Comparable<T>> extends Stack<T> {

, и оно должно работать.Или, в качестве альтернативы, вы можете взять максимум с двумя аргументами, который принимает Comparator в качестве второго аргумента.

0 голосов
/ 17 декабря 2018

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

if (!MyStack.isEmpty()) {
Integer max = Collections.min(MyStack, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
  return o2.compareTo(o1);
}
});
}
0 голосов
/ 17 декабря 2018
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

работает только для Collection s, тип элемента которых реализует интерфейс Comparable.

Следовательно, ваш код будет работать с правильной привязкой типа:

class MyStack<T extends Comparable<T>> extends Stack<T> {
    public T craftyMax() {
        return Collections.max(this);
    }
}

Хотя я не уверен в вашем втором методе (max()).Вы кастуете T на Integer.Если вы уверены, что T является Integer, почему бы не определить MyStack как class MyStack extends Stack<Integer>?

...