Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在堆栈上使用提供的Java集合方法,如max、min、sort等?_Java_Data Structures_Collections_Stack - Fatal编程技术网

是否可以在堆栈上使用提供的Java集合方法,如max、min、sort等?

是否可以在堆栈上使用提供的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

我正在研究一个涉及HackerRank()上堆栈的问题。问题的一部分要求提供堆栈中的最大值。我认为一个简单的方法就是用max()方法编写一个扩展堆栈类(见下文)。这是可行的,但我认为更简单的方法可能是利用Java的Collections方法。因此,我构建了craftyMax()方法(如下所示)

类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);
}
});
}