有序插入偶尔与原始类型&字符串

时间:2011-11-18 01:42:59

标签: data-structures comparable insertion-sort

对于作业,我们被要求将LinkedLists的有序和无序版本实现为Java中的包。有序版本将简单地扩展无序的实现,同时覆盖插入方法。

插入功能的排序有点......给出一个

的测试数组
String[] testArray= {"z","g","x","v","y","t","s","r","w","q"};

输出

q w r s t y v x g z 

什么时候应该

g q r s t v w x y z

但是,当元素没有混淆时,排序正常。例如,我最初使用上面的testArray[],alphabe反转,排序完全正确。

我的添加功能是

@Override
public void add(E e){
    Iter iter= new Iter(head.prev);
    int compValue;
    E currentItem= null;

    //empty list, add at first position
    if (size < 1)
        iter.add(e);

    else {

        while (iter.hasNext()){
            currentItem= iter.next(); //gets next item

            //saves on multiple compareTo calls
            compValue= e.compareTo(currentItem); 

            //adds at given location
            if (compValue <= 0)
                iter.add(e, iter.index);

            else //moves on
                currentItem= iter.next();
        }
    }
}

迭代器功能实现为

//decided to use iterator to simplify method functionality
protected class Iter implements Iterator<E>, ListIterator<E>{
    protected int index= 0;
    protected Node current= null;

//Sets a new iterator to the index point provided
    public Iter(int index){
        current= head.next;
        this.index=0;
        while (index > nextIndex()) //moves on to the index point
            next();
    }

public void add(E e, int index){
        size++;

        Iter iterator= new Iter(index);

        Node node= new Node();
        Node current= iterator.current.prev;

        node.next= current.next;
        node.prev= current;
        node.next.prev= node;
        node.prev.next= node;

        node.item= e;
    }

就像现在一样,唯一使用的东西是原始类型。我知道对于对象,必须编写一个特定的可比类,但在这种情况下,String包含一个compareTo()方法,该方法应该给出正确的顺序。

偶然的机会,我的同学有类似的实施,并返回相同的结果。

使用自然排序,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

关于你的add()函数的三件事突然出现在我身上:

  1. 它应该在插入新值后立即退出循环;这实际上可能不是问题,但继续寻找
  2. 是低效的
  3. 您在循环的顶部调用next_item,但如果未添加该值则将其称为AGAIN
  4. 如果您的列表中只有1个值,并且您尝试添加的值大于列表中当前的值,那么新值是否会无法添加?