是否可以在堆栈上使用提供的Java集合方法,如max、min、sort等?
我正在研究一个涉及HackerRank()上堆栈的问题。问题的一部分要求提供堆栈中的最大值。我认为一个简单的方法就是用max()方法编写一个扩展堆栈类(见下文)。这是可行的,但我认为更简单的方法可能是利用Java的Collections方法。因此,我构建了craftyMax()方法(如下所示)是否可以在堆栈上使用提供的Java集合方法,如max、min、sort等?,java,data-structures,collections,stack,Java,Data Structures,Collections,Stack,我正在研究一个涉及HackerRank()上堆栈的问题。问题的一部分要求提供堆栈中的最大值。我认为一个简单的方法就是用max()方法编写一个扩展堆栈类(见下文)。这是可行的,但我认为更简单的方法可能是利用Java的Collections方法。因此,我构建了craftyMax()方法(如下所示) 类MyStack扩展堆栈{ 公共T-craftyMax(){ return Collections.max(这个); } 公共T max(){ 整数最大值=整数最小值; 对于(T项:本){ max=Mat
类MyStack扩展堆栈{
公共T-craftyMax(){
return Collections.max(这个);
}
公共T max(){
整数最大值=整数最小值;
对于(T项:本){
max=Math.max((整数)项,max);
}
返回(T)最大值;
}
}
当然,这不起作用,因为编译器回答:
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
Solution.java:6:错误:找不到适合max(MyStack)的方法
return Collections.max(这个);
^
方法Collections.max(Collection
我不确定您的第二种方法(max()
)但是,您正在将T
转换为Integer
。如果您确定T
是Integer
,为什么不将MyStack
定义为类MyStack扩展堆栈
?您只能在实现可比
接口.C的类型上使用单个参数调用集合.max
将类型声明更改为
class MyStack<T extends Comparable<T>> extends Stack<T> {
类MyStack扩展堆栈{
或者,作为一种替代方法,您可以将使用比较器的最大双参数作为第二个参数。您可以覆盖比较器以匹配您的功能,如下所示
if (!MyStack.isEmpty()) {
Integer max = Collections.min(MyStack, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
}
if(!MyStack.isEmpty()){
整数max=Collections.min(MyStack,newcomparator(){
@凌驾
公共整数比较(整数o1,整数o2){
返回o2.compareTo(o1);
}
});
}
Collections#max
当然可以在堆栈上工作。我认为真正的问题是,您的自定义代码已损坏,您需要帮助。也许您应该编辑您的问题。为什么要在堆栈上执行max?想象一个真实世界的堆栈,您需要弹出每个元素并检查max,直到现在为止O(N)空格和O(N)时间复杂性?你可以在O(1)中完成通过将max元素添加到您正在存储的对象中作为字段。也不要使用Stack,因为从线程角度来看,所有方法都很昂贵,即使您在一个线程中使用Stack,也很昂贵。@SMA感谢您提供的信息。我明白,最好的方法是在添加项以提供O(1)时存储最大值关于检索max vs O(n)。然而,这不是我的问题。@TimBiegeleisen-like SMA提到max函数并不理想,因此不是真正的重点。我更喜欢O(1)解决方案,但我只使用提供的代码作为示例。如果您知道我实际问题的任何示例或文档,请告诉我。
class MyStack<T extends Comparable<T>> extends Stack<T> {
public T craftyMax() {
return Collections.max(this);
}
}
class MyStack<T extends Comparable<T>> extends Stack<T> {
if (!MyStack.isEmpty()) {
Integer max = Collections.min(MyStack, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
}