簡體   English   中英

是否可以在堆棧上使用提供的Java Collections方法,例如max,min,sort,ect…?

[英]Is it possible to use the provided Java Collections methods, like max, min, sort, ect…, on a Stack?

我正在處理一個涉及HackerRank上的堆棧的問題( 請參閱此處 )。 問題的其中一部分要求在堆棧中提供最大值。 我認為一種簡單的方法是使用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

從那以后,我嘗試了幾種不同的方法並四處張望,但似乎找不到我在這里嘗試做的事情是否可行。 所以我的問題是:

是否可以在Stack上/之內使用提供的Java Collections方法,例如max,min,sort,ect ...? 還是我期望過高?

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

僅適用於其元素類型實現Comparable接口的Collection

因此,您的代碼將與正確的類型綁定一起使用:

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>呢?

您只能在實現Comparable接口的類型上使用單個參數調用Collections.max 將類型聲明更改為

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

它應該工作。 或者,您也可以采用將Comparator作為第二個參數的兩個參數的最大值。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM