[英]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.