作者定義了一個StringLengthComparator類,用于比較佇列中專案的String長度。
class StringLengthComparator implements Comparator<。 String> {
@Override
public int compare(String value1, String value2) {
return Integer.compare(value1.length(), value2.length() )。
}
}
Queue<String> queue = new PriorityQueue<>(new StringLengthComparator() 。)
通過這個宣告,我們可以按字串長度對優先級佇列進行排序。
在這里我不知道為什么在創建佇列時使用 "new StringLengthComparator()"?它似乎從未被使用或在宣告后被呼叫。
uj5u.com熱心網友回復:
當你執行new StringLengthComparator()時,你正在創建一個StringLengthComparator的新實體。
這個實體將作為引數傳遞給PriorityQueue的建構式,作為Comparator,根據它的不同元素被排序。請參閱相關的javadocs.
它相當于這樣:
Comparator comparator = new StringLengthComparator() 。
Queue<String> queue = new PriorityQueue<>(comparator)。
在你的代碼中看不到對這個Comparator的進一步參考,但它被PriorityQueue內部使用。你可以通過查看該類的源代碼來驗證:
/...
@SuppressWarnings("unchecked")
public class PriorityQueue< E> extends AbstractQueue<E>
implements java.io.Serializable {
//...
/**。
* 創建一個{@code PriorityQueue},具有默認的初始容量和
* 其元素是根據指定的比較器來排序的。
*
* @param comparator 將被用于排序這個
* 優先級佇列。 如果{@code null},{@linkplain Comparable
*元素的自然排序}將被使用。
* @since 1.8
*/
public PriorityQueue(Comparator< ? super E> comparator){
this(DEFAULT_INITIAL_CAPACITY, comparator);
}
/**。
* 創建一個{@code PriorityQueue},并指定初始容量。
*根據指定的比較器對其元素進行排序。
*
* @param initialCapacity 這個優先級佇列的初始容量。
* @param comparator 將被用于排序這個
* 優先級佇列。 如果{@code null},{@linkplain Comparable
*元素的自然排序}將被使用。
* @throws IllegalArgumentException 如果{@code initialCapacity}是
* 小于1
*/
public PriorityQueue(int initialCapacity,
比較器<? super E> comparator) {
//注意:這個至少有一個的限制實際上是不需要的,
//但是為了1.5的兼容性而繼續保留。
if (initialCapacity < 1)
throw new IllegalArgumentException()。
this.queue = new Object【initialCapacity】。
this.comparator = comparator;
}
//...。
uj5u.com熱心網友回復:
根據 PriorityQueue的檔案(來自oracle java檔案)-
PriorityQueue(Comparator< ? super E> comparator) 創建一個具有默認初始容量的優先級佇列 并且其元素是根據 指定的比較器排序。
class StringLengthComparator implements Comparator的目的是確定佇列如何被排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328109.html
標籤:
上一篇:是否可以在單元測驗中使用fakeiteasy用3個型別的引數來呼叫"事件Action<>"?
下一篇:在Keras中加載測驗影像
