java - 是否可以在堆栈上使用提供的 Java 集合方法,例如 max、min、sort 等...?
问题描述
我正在研究一个涉及 HackerRank 上的 Stacks 的问题(请参阅此处)。问题的一部分要求提供堆栈中的最大值。我认为一个简单的方法是使用 max() 方法编写一个扩展的 Stack 类(见下文)。这行得通,但我认为更简单的方法可能是利用 Java 的 Collections 方法。所以我建立了 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 等...?还是我期待的有点多?
解决方案
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
仅适用于Collection
元素类型实现Comparable
接口的 s。
因此,您的代码将使用正确的类型绑定:
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>
?