接收可比对象 [] 时找不到 compareTo
Cannot find compareTo when receiving comparable Object[]
问题是该方法不确定 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
我是否应该在此 class 中实现并扩展与 ObjectType 的可比性并覆盖 compareTo?
我建议你把签名改成
public static <T extends Comparable<T>> List<T> sorted(T[] a, T[] b)
您将能够比较 a[i].compareTo(b[i])
和 return 适当类型的列表。
要在对象上调用 compareTo()
,class 必须实现 Comparable
接口并覆盖 compareTo()
方法。由于Object
class没有实现Comparable
,上面的代码总是会报错
如果只想传递 Person 对象,则需要更改签名以接受 Person[]
数组。如果不是,则需要覆盖 toString() 方法(具有有意义的实现)并将 a[i].compareTo(b[j])
更改为 a[i].toString().compareTo(b[j].toString())
.
问题是该方法不确定 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.
我是否应该在此 class 中实现并扩展与 ObjectType 的可比性并覆盖 compareTo?
我建议你把签名改成
public static <T extends Comparable<T>> List<T> sorted(T[] a, T[] b)
您将能够比较 a[i].compareTo(b[i])
和 return 适当类型的列表。
要在对象上调用 compareTo()
,class 必须实现 Comparable
接口并覆盖 compareTo()
方法。由于Object
class没有实现Comparable
,上面的代码总是会报错
如果只想传递 Person 对象,则需要更改签名以接受 Person[]
数组。如果不是,则需要覆盖 toString() 方法(具有有意义的实现)并将 a[i].compareTo(b[j])
更改为 a[i].toString().compareTo(b[j].toString())
.