2017-04-03 18 views
-2

參考下面提供的代碼,在main()方法中,傳遞給靜態sort()函數的實際參數的類型爲String [](變量a),但是類型的形式參數()函數的類型爲Comparable []。由於這兩種類型似乎不匹配,這怎麼可能?是否有某種隱式對象轉換適用於我不知道的函數調用?任何幫助,將不勝感激。函數調用期間的隱式對象轉換

Merge.java

下面是語法從§2.2歸併強調Merge.java的版本。

/****************************************************************************** 
* Compilation: javac Merge.java 
* Execution: java Merge < input.txt 
* Dependencies: StdOut.java StdIn.java 
* 
* 
* Sorts a sequence of strings from standard input using mergesort. 
* 
* % more tiny.txt 
* S O R T E X A M P L E 
* 
* % java Merge < tiny.txt 
* A E E L M O P R S T X     [ one string per line ] 
*  
* % more words3.txt 
* bed bug dad yes zoo ... all bad yet 
* 
* % java Merge < words3.txt 
* all bad bed bug dad ... yes yet zoo [ one string per line ] 
* 
******************************************************************************/ 

/** 
* The {@code Merge} class provides static methods for sorting an 
* array using mergesort. 
* <p> 
* For additional documentation, see <a href="http://algs4.cs.princeton.edu/22mergesort">Section 2.2</a> of 
* <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne. 
* For an optimized version, see {@link MergeX}. 
* 
* @author Robert Sedgewick 
* @author Kevin Wayne 
*/ 
public class Merge { 

    // This class should not be instantiated. 
    private Merge() { } 

    // stably merge a[lo .. mid] with a[mid+1 ..hi] using aux[lo .. hi] 
    private static void merge(Comparable[] a, Comparable[] aux, int lo, int mid, int hi) { 
     // precondition: a[lo .. mid] and a[mid+1 .. hi] are sorted subarrays 
     assert isSorted(a, lo, mid); 
     assert isSorted(a, mid+1, hi); 

     // copy to aux[] 
     for (int k = lo; k <= hi; k++) { 
      aux[k] = a[k]; 
     } 

     // merge back to a[] 
     int i = lo, j = mid+1; 
     for (int k = lo; k <= hi; k++) { 
      if  (i > mid)    a[k] = aux[j++]; 
      else if (j > hi)    a[k] = aux[i++]; 
      else if (less(aux[j], aux[i])) a[k] = aux[j++]; 
      else       a[k] = aux[i++]; 
     } 

     // postcondition: a[lo .. hi] is sorted 
     assert isSorted(a, lo, hi); 
    } 

    // mergesort a[lo..hi] using auxiliary array aux[lo..hi] 
    private static void sort(Comparable[] a, Comparable[] aux, int lo, int hi) { 
     if (hi <= lo) return; 
     int mid = lo + (hi - lo)/2; 
     sort(a, aux, lo, mid); 
     sort(a, aux, mid + 1, hi); 
     merge(a, aux, lo, mid, hi); 
    } 

    /** 
    * Rearranges the array in ascending order, using the natural order. 
    * @param a the array to be sorted 
    */ 
    public static void sort(Comparable[] a) { 
     Comparable[] aux = new Comparable[a.length]; 
     sort(a, aux, 0, a.length-1); 
     assert isSorted(a); 
    } 


    /*************************************************************************** 
    * Helper sorting function. 
    ***************************************************************************/ 

    // is v < w ? 
    private static boolean less(Comparable v, Comparable w) { 
     return v.compareTo(w) < 0; 
    } 

    /*************************************************************************** 
    * Check if array is sorted - useful for debugging. 
    ***************************************************************************/ 
    private static boolean isSorted(Comparable[] a) { 
     return isSorted(a, 0, a.length - 1); 
    } 

    private static boolean isSorted(Comparable[] a, int lo, int hi) { 
     for (int i = lo + 1; i <= hi; i++) 
      if (less(a[i], a[i-1])) return false; 
     return true; 
    } 


    /*************************************************************************** 
    * Index mergesort. 
    ***************************************************************************/ 
    // stably merge a[lo .. mid] with a[mid+1 .. hi] using aux[lo .. hi] 
    private static void merge(Comparable[] a, int[] index, int[] aux, int lo, int mid, int hi) { 

     // copy to aux[] 
     for (int k = lo; k <= hi; k++) { 
      aux[k] = index[k]; 
     } 

     // merge back to a[] 
     int i = lo, j = mid+1; 
     for (int k = lo; k <= hi; k++) { 
      if  (i > mid)     index[k] = aux[j++]; 
      else if (j > hi)      index[k] = aux[i++]; 
      else if (less(a[aux[j]], a[aux[i]])) index[k] = aux[j++]; 
      else         index[k] = aux[i++]; 
     } 
    } 

    /** 
    * Returns a permutation that gives the elements in the array in ascending order. 
    * @param a the array 
    * @return a permutation {@code p[]} such that {@code a[p[0]]}, {@code a[p[1]]}, 
    * ..., {@code a[p[N-1]]} are in ascending order 
    */ 
    public static int[] indexSort(Comparable[] a) { 
     int n = a.length; 
     int[] index = new int[n]; 
     for (int i = 0; i < n; i++) 
      index[i] = i; 

     int[] aux = new int[n]; 
     sort(a, index, aux, 0, n-1); 
     return index; 
    } 

    { 
     if (hi <= lo) return; 
     int mid = lo + (hi - lo)/2; 
     sort(a, index, aux, lo, mid); 
     sort(a, index, aux, mid + 1, hi); 
     merge(a, index, aux, lo, mid, hi); 
    } 

    // print array to standard output 
    private static void show(Comparable[] a) { 
     for (int i = 0; i < a.length; i++) { 
      StdOut.println(a[i]); 
     } 
    } 

    /** 
    * Reads in a sequence of strings from standard input; mergesorts them; 
    * and prints them to standard output in ascending order. 
    * 
    * @param args the command-line arguments 
    */ 
    public static void main(String[] args) { 
     String[] a = StdIn.readAllStrings(); 
     Merge.sort(a); 
     show(a); 
    } 
} 
+1

不需要轉換,'String'實現'Comparable',所以它已經是必需的類型。 – Berger

+3

爲了將來的參考,代碼示例應該是最小的,即只包含與您的問題相關的代碼。因此,如果您對兩行代碼有疑問,請顯示這兩行代碼,而不是整個程序的來源。如果你在代碼之前沒有那麼整齊地總結你的問題,我不會費心去試圖理解這個問題。 – meriton

+0

另外,在stackoverflow上,您可以通過在編輯器中選擇它並按下相應的工具欄按鈕來格式化代碼。這次我爲你做了這個。 – meriton

回答

0

是否有某種隱含的對象鑄造的適用

鑄造是不是你的對象做一些事情,這是你在值做一些(如對象參考)。鑄造不會影響對象。但這裏沒有演員。

撇開原始類型,變量或X類型的放慢參數可以如果被分配Y類型的值類型Y

  • 是對相同類型X,或
  • 是一個class型實施X,或
  • 是一個子接口的X,直接或間接的影響。

類似地,陣列型X[]可分配Y[]類型的值,如果X可根據上述規則被分配Y

String implements Comparable,因此您可以將String分配給Comparable類型的變量或參數。由於陣列類型可根據元素類型進行分配,因此可將String[]分配給Comparable[]類型的變量或參數。

0

這是不特定於函數調用:

Comparable comparable = "hello"; 

String[] strings = {"hello", "world"}; 
Comparable[] comparables = strings; 

Java數組是協變的,這意味着數組分配,如果他們的元素類型。並且String可分配給Comparable,因爲String類實現了Comparable接口。