我正在做这个任务,我们必须创建两种类型的对象,
public class Person implements Cloneable, Comparable<Person>
和
public class Book implements Cloneable, Comparable<Book>
该程序的主要任务是使用自己的比较函数对两种类型进行排序,如下所示:
compareTo(Person o)
compareTo(Book o)
所以,我在main函数中创建了2个ListArray,用于存储book和person对象,如下所示:
List<Book> bookArray = new ArrayList<Book>();
List<Person> peopleArray = new ArrayList<Person>();
我的排序算法在另一个类中实现,如下所示:
public class Sort{
Comparable<Object>[] values;
public Sort(List<Object> inputArray) {
this.values = (Comparable<Object>[]) inputArray.toArray();
}
public doSort() {
//sort implementation...
}
问题是使用上面的数组调用此函数时
Sort sorter = new Sort(peopleArray);
sorter.doSort();
Eclipse显示错误提示“构造函数Sort(List)未定义。” 我在这做错了什么? 提前谢谢。
答案 0 :(得分:2)
您可以将任何类实例传递给Object类型。但List不是List的父级。这只是两种不同的类型。
你可以说
public Sort(List<? extends Object> inputArray)
这样它就会接受任何类型。
答案 1 :(得分:2)
仅仅因为你命名字段&#34; personArray&#34;不使它成为一个数组 - 当声明构造函数期望一个数组时,你传入一个List
。
我建议你永远不要使用数组,除非你绝对必须;相反,使用集合,因为它们所以更容易处理,与普遍看法相反,性能差异可以忽略不计。
如果从代码中删除所有数组,并添加一些泛型,它将全部起作用:
public class Sort<T extends Comparable<T>> {
private List<T> values;
public Sort(List<T> values) {
this.values = values;
}
public void doSort() {
Collections.sort(values);
}
}
请注意,如果完全排序,这整个类只会增加很少的值。您的客户端代码可以只改为编码这一行:
Collections.sort(values);
答案 2 :(得分:0)
它不是那么清楚,但如果你是对的Whenevr你使用另一个新类进行排序,这可能是实现COMPARATOR。
所以在你的例子中,排序类应该是
Class Sort implemets Comaparator<Person> {
public void Compare(Object 01,Object 02) {
return (Person)o1.comapareTo(Person)o2;
}
然后在main
,请致电
Collections.sort(list,new Sort());
你也需要为书做。