Collection.sort不适用于我的数组

时间:2016-03-14 07:40:22

标签: java arrays list sorting collections

我创建了自己的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(" ");
    }
}

3 个答案:

答案 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课程。