我创建了自己的MyArrayList,但无法对其进行排序。正常的Arraylist可以按Collections.sort
排序,但我的不能。有人可以告诉我哪里出错了吗?
import java.util.*;
public class TestMyArrayList
{
public static void main(String[] args){
String[] subjects = {"EIE320", "EIE558", "EIE375", "EIE424"};
Integer[] marks = {90,85,70,80};
MyArrayList<String> sList = new MyArrayList<String>(subjects);
Collections.sort(sList);
sList.print();
MyArrayList<Integer> mList = new MyArrayList<Integer>(marks);
Collections.sort(mList);
mList.print();
}
}
public class MyArrayList<E> extends ArrayList<E>
implements List<E>
{
private List<E> data;
public MyArrayList()
{
}
public MyArrayList(E[] inputdata){
super();
data = new ArrayList<E>();
for(E e:inputdata){
data.add(e);
}
}
public void print(){
for(Iterator iter = data.iterator();iter.hasNext();){
System.out.print(iter.next() + " ");
}
System.out.println(" ");
}
}
答案 0 :(得分:5)
MyArrayList
的构造函数是错误的。由于您要扩展ArrayList
,因此您不应在ArrayList
构造函数中创建另一个MyArrayList
实例。只需将元素添加到this
ArrayList
。
当您在Collections.sort()
个实例上致电MyArrayList
时,它不会对data
成员List
进行排序。
public MyArrayList(E[] inputdata){
super();
for(E e:inputdata){
super.add(e);
}
}
不需要您的data
会员。如果使用合成而不是继承,则只需要这样的成员,在这种情况下,您的类不会扩展ArrayList
。
您还应该修改print
方法:
public void print(){
for(Iterator iter = iterator();iter.hasNext();){
System.out.print(iter.next() + " ");
System.out.println(" ");
}
答案 1 :(得分:0)
如果您看到Collections.java
的源代码,您会看到Collections.sort
调用具体列表中定义的sort
方法,在这种情况下是'MyArrayList.java'。您没有提供此方法,因此您的类从超类ArrayList.java
继承此内容现在,如果您看到ArrayList.java
的源代码,您会发现其中定义的sort
方法执行的过程在Object[] elementData;
上排序。您尚未在elementData
中设置数据(在ArrayList.java
中定义)。
您可以使用public ArrayList(Collection<? extends E> c)
中的public MyArrayList(E[] inputdata)
构造函数。您必须转换inputdata
,然后调用构造函数super()
,而不是调用public ArrayList(Collection<? extends E> c)
。
作为一个建议,同样由Eran给出的答案指出,你可以使用组合,在你的类中你可以有一个ArrayList的引用,然后可以用它来添加,删除和对它进行排序(定义方法排序和在其中调用Collections.sort对你有的ArrayList对象。
答案 2 :(得分:0)
只是提醒你可以使用Arrays.asList()
而不是做你在这里做的事情。
String[] subjects = {"EIE320", "EIE558", "EIE375", "EIE424"};
ArrayList<String> sList = new ArrayList<String>(Arrays.asList(subjects));
如果你这样做是一个很好的练习,但我通常会尽可能避免重写Collections
课程。