【问题标题】:Is it possible to use the provided Java Collections methods, like max, min, sort, ect..., on a Stack?是否可以在堆栈上使用提供的 Java 集合方法,例如 max、min、sort 等...?
【发布时间】:2019-05-17 12:37:17
【问题描述】:

我正在处理一个涉及 HackerRank (See Here) 上的 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 等...?还是我期待的有点高?

【问题讨论】:

  • Collections#max 当然适用于堆栈。我认为这里真正的问题是您的自定义代码已损坏,您需要帮助。也许你应该编辑你的问题。
  • 为什么要在 Stack 上做 max?想想一个现实世界的堆栈,您需要弹出每个元素并检查直到现在的最大 O(N) 空间和 O(N) 时间复杂度?您可以在 O(1) 中通过将 max 元素添加为您正在存储的对象中的字段来完成此操作。也不要使用堆栈,因为从线程的角度来看,所有方法都很昂贵,即使您在一个线程中使用堆栈也很昂贵。
  • @SMA 感谢您提供的信息。我确实明白,最好的方法是在添加项目时存储最大值,以便在检索最大值与 O(n) 时提供 O(1)。不过,这不是我的问题。
  • @TimBiegeleisen 喜欢 SMA 提到 max 函数并不理想,因此不是重点。我更喜欢 O(1) 解决方案,但我仅使用提供的代码作为示例。如果您知道我的实际问题的任何示例或文档,请告诉我。

标签: java data-structures collections stack


【解决方案1】:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

仅适用于元素类型实现Comparable 接口的Collections。

因此,您的代码将使用正确的类型绑定:

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

不过,我不确定您的第二种方法 (max())。您正在将T 转换为Integer。如果您确定TInteger,为什么不将MyStack 定义为class MyStack extends Stack&lt;Integer&gt;

【讨论】:

    【解决方案2】:

    对于实现Comparable 接口的类型,您只能使用单个参数调用Collections.max。将类型声明更改为

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

    它应该可以工作。或者,作为替代方案,您可以采用将Comparator 作为第二个参数的双参数最大值。

    【讨论】:

      【解决方案3】:

      您可以覆盖比较器以匹配您的功能,如下所示。

      if (!MyStack.isEmpty()) {
      Integer max = Collections.min(MyStack, new Comparator<Integer>() {
      @Override
      public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);
      }
      });
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-05
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        • 2011-10-31
        • 1970-01-01
        • 2019-09-22
        相关资源
        最近更新 更多