2016-03-02 21 views
0

問題是該方法不確定a和b是否具有可比性,因此編譯器會針對compareTo引發找不到符號。收到可比對象時找不到compareTo []

public class Merge { 
    public ArrayList<Object> sorted(Object[] a, Object[] b) { 

     int i, j, k; 
     i = j = k = 0; 
     ArrayList<Object> c = new ArrayList<>(); 
     while (i < a.length || j < b.length) { 
      if (i == a.length) { 
       for (j = j; j < b.length; j++) { 
        c.add(k, b[j]); 
        k++; 
       } 
       break; 
      } 
      else if (j == b.length) { 
       for (i = i; i < a.length; i++) { 
        c.add(k, a[i]); 
        k++; 
       } 
       break; 
      } 
      else { 
       if (a[i].equals(b[j]) || a[i].compareTo(b[j]) < 0) { 
        c.add(k, a[i]); 
        i++; 
        k++; 
       } 
       else { 
        c.add(k, b[j]); 
        j++; 
        k++; 
       } 
      } 
     } 
     return c; 
    } 
} 

該代碼與Integer一起使用時工作。我想能夠使用,例如,sorted(a, b)a = Person[]b = Person[]。當然在Person中使用compareTo和equals方法。

我應該實現並擴展與此類中的ObjectType相比並重寫compareTo嗎?

回答

2

我建議你改簽名

public static <T extends Comparable<T>> List<T> sorted(T[] a, T[] b) 

,你將能夠比較a[i].compareTo(b[i])和返回興田適當類型的列表。

+0

嘿,謝謝你的幫助!我可以在簽名中使用ArrayList 嗎?你能解釋一下爲什麼你建議使用這個簽名或者我應該研究哪些話題? – niklabaz

0

要在對象上調用compareTo(),類必須實現Comparable接口並覆蓋compareTo()方法。由於Object類沒有實現Comparable,上面的代碼總是會給你編譯錯誤。

如果您只想傳遞Person對象,那麼您需要將簽名更改爲接受Person[]數組。如果不是,那麼您需要重寫toString()方法(使用有意義的實現)並將a[i].compareTo(b[j])更改爲a[i].toString().compareTo(b[j].toString())