簡體   English   中英

Java比較器接口和初始化比較器

[英]Java comparator interface and initializing comparator

我有一個關於Comparator界面的問題。 在我的類下面,實現了按長度對字符串排序的接口,而不是按字符值排序的默認排序。

覆蓋默認比較之后,我使用Arrays.sort()對字符串數組進行排序。 即使我重寫了默認方法,但是如果我使用Arrays.sort,它也會調用默認的compare而不是我的重寫方法。 這是因為我明確地調用了超類方法嗎?

另一個問題是初始化接口本身。 我知道您無法初始化接口,而只能初始化一個類對象(實現所述接口)以引用該接口可用的方法。 在這種情況下,當我初始化比較器時, Arrays.sort(strArr, new Ideone()); 排序工作正常。 該方法如何知道我正在將其傳遞給比較器? 我只初始化了一個類對象,沒有顯式調用compare(ob1, ob2)方法。

即使我Comparator x = new Ideone(); ,如何將類對象簡化為比較器對象? 任何對此的解釋將是有幫助的。

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone implements Comparator
{

    static String ThirdGreatest(String[] strArr)
    { 
        Arrays.sort(strArr);
        //Arrays.sort(strArr, new Ideone());
        for(String x: strArr)
            {
            System.out.println(x);
            }
        return strArr[strArr.length-3];
    } 

    @Override
    public int compare(Object s1, Object s2)
    {
        return (s1.toString().length() - s2.toString().length());
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        String[] myarr = {"coder","byte","code", "asfasfasfasf"};
        System.out.println(ThirdGreatest(myarr));
    }
}

即使我重寫了默認方法,但是如果我使用Arrays.sort,它也會調用默認的compare而不是我的重寫方法。 這是因為我明確地調用了超類方法嗎?

不,這是因為在給出的示例中,您沒有傳遞比較器-因此sort方法無法得知您正在嘗試使用自定義比較。

在這種情況下,當我初始化比較器時, Arrays.sort(strArr, new Ideone()); 排序工作正常。 該方法如何知道我正在將其傳遞給比較器?

因為您正在調用接受比較器的重載。 只有 一個過載有兩個參數:

public static <T> void sort(T[] a, Comparator<? super T> c)

現在公認的是,如果您實現Comparator<String>而不是原始的Comparator類型,那會更好,但是它仍然有效。

我只初始化了一個類對象,沒有顯式調用compare(ob1, ob2)方法。

確實- 不必打電話compare 這就是sort方法的工作。 傳遞比較器,以便可以調用compare

我認為這里的問題是,雖然您創建了一個用於Arrays.sort的比較器,但實際上並沒有告訴Arrays.sort使用它。 默認情況下,如果您只是說

 Arrays.sort(strArr);

然后使用默認比較器對字符串進行排序 要告訴排序算法使用您的自定義比較器, 您需要將其作為第二個參數傳遞給該方法:

 Arrays.sort(strArr, new Ideone());

嘗試看看是否可以解決問題。 作為一個有趣的測試,在比較函數中放置一個println語句,以查看是否可以看到它被調用。

也就是說,以這種方式實現比較器是非常不尋常的。 更常見的路線是執行以下操作:

 Arrays.sort(strArr, new Comparator<String>() {
     public int compare(Object s1, Object s2) {
       return (s1.toString().length() - s2.toString().length());
     }
 });

現在,您不需要在Ideone類上實現compare ,這使我們更清楚地知道(1)它不會被自動調用,並且(2)僅在此排序步驟中需要它。

Arrays.sort(strArr)

這使用java比較器對字符串對象數組進行排序。 您尚未告訴排序函數使用您創建的比較函數。 需要參考您的Ideone類。

Comparator x = new Ideone();

因為Ideone()實現了Comparator,所以它必須實現Comparator接口內的所有方法。 變量x將使用Ideone類的compare方法,因為它已被覆蓋。 但是,如果您嘗試使用Ideone類中不在Comparator類中的方法,則將引發異常。

暫無
暫無

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

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