问题是方法不确定a和b是否具有可比性,因此编译器会抛出一个找不到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?
答案 0 :(得分:2)
我建议您将签名更改为
public static <T extends Comparable<T>> List<T> sorted(T[] a, T[] b)
您将能够比较a[i].compareTo(b[i])
并返回适当类型的列表。
答案 1 :(得分:0)
要在对象上调用compareTo()
,类必须实现Comparable
接口并覆盖compareTo()
方法。由于Object
类没有实现Comparable
,上面的代码总是会给你编译错误。
如果您只想传递Person对象,则需要更改签名以接受Person[]
数组。如果没有,则需要覆盖toString()方法(使用有意义的实现)并将a[i].compareTo(b[j])
更改为a[i].toString().compareTo(b[j].toString())
。