如何在Java中将项目添加到链接列表?

时间:2009-12-08 04:03:32

标签: java linked-list

使用Comparator和Iterator,我尝试按顺序将对象添加到链接列表中。到目前为止,我有以下内容:

public class ComparatorClass implements Comparator<Integer> {
    public int compare(Integer int1, Integer int2) {
        return int1.compareTo(int2);
    }
}

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;

public class OrderedListInheritance implements LinkedList {

    ArrayList<Object> myList = new ArrayList<Object>();

    Comparator comp = new ComparatorClass();

    OrderedListInheritance(Comparator c) {
        this.comp = c;
    }

    @Override
    public void add(Object o) {
        addLast(o);
    }

    @Override
    public void addAtIndex(int index, Object o) {
        Iterator it = getIterator();
        while (it.hasNext()) {
            Object element = it.next();
            if (comp.compare(element, o) < 0) {

        }else if (comp.compare(element, o) == 0) {

        }else{
            myList.add(o);
        }
        }
    }

    @Override
    public void addFirst(Object o) {
        addAtIndex(0, o);
    }

    @Override
    public void addLast(Object o) {
        addAtIndex(myList.size(), o);
    }

    @Override
    public Object get(int index) {
        return myList.get(index);
    }

    @Override
    public Iterator getIterator() {
        Iterator iter = myList.iterator();
        return iter;
    }

    @Override
    public int indexOf(Object o) {
        return myList.indexOf(o);
    }

}

我不确定如何将Iterator与比较器结合使用,以便按顺序将每个元素添加到链接列表中。有人可以帮我解释逻辑吗?

5 个答案:

答案 0 :(得分:3)

你的比较器错了。

比较器的一般合同的一部分是,如果compare(a, b)为正,compare(b, a)为负。

如果您传入的比较器不符合比较器合约,您将会得到未定义的行为。

答案 1 :(得分:1)

如果实现add方法以按排序顺序插入元素(或除列表末尾之外的任何位置),则违反了List接口的约定。从语义上讲,它不是List,将它传递给任何期望的代码是不安全的。假装实现List界面只会导致麻烦。

如何使用TreeSet?代替?

Set<Integer> list = new TreeSet<Integer>();

当然,Set不允许重复元素。

如果你想要一些允许重复的东西,但仍然允许有效的有序检索,试试一个基于堆的集合,比如PriorityQueue.

答案 2 :(得分:0)

是否有任何理由不能使用普通ArrayList,然后拨打Collections.sort(list)Collections.sort(list, comparator)

答案 3 :(得分:0)

我会这样写:

public class IntegerComparator 
    implements Comparator<Integer> 
{
    public int compare(final Integer a, final Integer b) 
    {
        return (a.compareTo(b));
    }
}

我打算在代码上发表更多评论......但是你所提供的内容将无法正常工作......你声明了一个ArrayList,但是后来想要使用一个Comparator并且你没有投射......所以赢得了'编译。

另一个问题是你不应该使用== 1你应该使用&lt; 0和&gt; 0,因为比较器可能不返回1,0,-1,但也可以返回其他数字。你也没有处理所有情况a&lt; b,a == b,a&gt;湾

答案 4 :(得分:0)

我们在做功课吗?您的问题似乎与比较器接口没有那么多,因为它清楚地了解您希望它做什么。这听起来像是一个倡导测试驱动开发风格的完美场所。首先编写测试以插入空列表,插入列表的头部,插入尾部,插入长度为2的列表中间。然后编写测试以返回第n个元素和元素给定的价值。在这些简单的情况工作之后,很容易在有序列表中找到元素,该元素是第一个大于要插入的元素的元素,并在较大的元素前面添加元素。不要忘记添加重复值的边缘情况,小于列表中任何值的值以及大于列表中任何值的值。