簡體   English   中英

Array.sort():Comparable的compareTo()僅接受一個參數?

[英]Array.sort(): Comparable's compareTo() only takes one argument?

這是一個適合所有人的好選擇; 我花了好幾個小時試圖找出答案:

我試圖使用Array.sort()按層對對象數組進行排序,並按照另一篇關於堆棧溢出的教程進行操作,我嘗試了以下代碼:

Arrays.sort(gameobj, new Comparator<GameObject>() {
    @Override
    public int compare(GameObject o1, GameObject o2) {
        return o1.layer.compareTo(o2.layer);
    }});

這段代碼對我來說很有意義,但是問題是,該接口只為compare()方法接受一個參數。 我也嘗試過lambda表達式,但這會引發“刪除此令牌”編譯錯誤。 我正在使用Java8。非常感謝您的幫助或建議。

因為Comparable用於比較兩個元素ab ,其中a是實現的Object 如果您使用的是Comparable則無需將Comparator傳遞給Arrays.sort方法(它將使用實例本身來執行比較)。

簡潔的速記

從類方法返回的可比較輸出中創建比較器的最簡潔方法是:

Arrays.sort(gameobj, Comparator.comparing(GameObject::getLayer));

另一個解決方案:實現可比性

在您的情況下,您可能還希望直接實現Comparable並將比較委托給Layer類:

public class GameObject implements Comparable<GameObject> {
    // ...

    @Override
    public int compareTo(GameObject that) {
        return this.getLayer().compareTo(that.getLayer());
    }
}

Arrays.sort(gameobj);

何時使用可比與比較器

  • Comparable是用於在類上實現自然順序。 如果您的班級自然帶有任何人都期望的訂單關系,那么“ Comparable非常適合您。

  • Comparator器更適合特定用例中的特定排序邏輯。 它使您可以將要在特定上下文中對元素進行排序的方式與元素本身的類分離。 它更加靈活,因為您可以在任意數量的上下文中提供任意數量的比較器,而對於給定的類只能實現一次Comparable

Java有兩種比較類型。

比較器 -接受2個參數,它與模型分離,可以有多個比較器根據不同情況進行比較。 它更具動態性。

可比 -這是一個接口,您的模型(實體)必須實現方法,該方法將自己與另一個相同類型的實體進行比較。 這不太靈活,但是為您提供了“默認”排序方法。 缺點是您無法在運行時更改它。

因此,您的Arrays.sort與Lists.sort一樣,都需要一個附加參數-comparator,以便您可以選擇在運行時使用哪個Comparator:

Arrays.sort(gameobj, Comparators.comparing(GameObject::getLayer))

您可以按以下方式重構代碼:

Arrays.sort(gameobj, Comparator.naturalOrder());

編輯:如果gameobj的對象實現Comparable接口,則這是一個解決方案。

暫無
暫無

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

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