【问题标题】:How to insert an element in a sorted list in Java如何在Java中的排序列表中插入元素
【发布时间】:2014-06-27 07:10:33
【问题描述】:

我必须在 java 中创建自己的列表。要插入的元素(Person 元素)必须排序(从低到高)。 所以我创建了一个方法 compareTo 来检查插入的人的名字。 问题在于插入方法。我写了这段代码:

public boolean insert(Person p){
    PersonListElement element = new PersonListElement(p);
    boolean inserted = false;
    if(containsElement(p) == true){
        inserted = false;
        return inserted;
    }
    if(head == null){
        head = element;
        size = size + 1;
        inserted = true;
        return inserted;
    }
    PersonListElement position = head;
    PersonListElement prev = null;
    while(position != null){
        if(position.getValue().compareTo(element.getValue()) < 0){
            if(prev != null){
                prev.setNext(element);
                element.setNext(position);
                inserted = true;
                position = null;
            }
            prev = position;
            position = position.getNext(); //here i get pointerException prob.
        }
    }
    if(inserted == false && prev != null){
        prev.setNext(element);
        inserted = true;
    }
    size = size + 1;
    return inserted;
}

这是我的方法,但还没有完成。你能帮帮我吗?

编辑:

我也尝试了一种删除元素的方法。我认为我的代码适用于空列表、1 大小列表以及元素不在列表末尾的情况。但我不知道我的方法是否删除了最后一个元素:

public boolean delete(Person p){
    boolean deleted = false;
    if(size == 0){
        deleted = false;
        return deleted;
    }
    if(size == 1 && head.getValue().compareTo(p) == 0){
        head = null;
        deleted = true;
        return deleted;
    }
    PersonListElement current = head;
    PersonListElement prev = null;
    PersonListElement next = head;
    next = next.getNext();
    while(next != null){
        if(current.getValue().compareTo(p) == 0){
            prev.setNext(next);
            deleted = true;
            return deleted;
        }
        prev = current;
        current.getNext();
        next.getNext();
    }
    return deleted;
}

我用这个类测试了我的代码:

class SortList
{
    public static void main(String args[]){
        SortedList list = new SortedList();
        Person a = new Person("Alice", 10);
        list.insert(a);
        a = new Person("Al", 20);
        list.insert(a);
        a = new Person("Bo", 90);
        list.insert(a);
        p = new Person("Cin", 3);
        list.insert(a);     
        System.out.println(list);
        }
}

【问题讨论】:

  • 你班上的其他人是什么样子的?
  • 不确定您的分配是否允许,但 Java 有一些不错的 baked in features 用于排序,并且使用您的 compareTo 方法,您已经成功了一半。

标签: java list class sorting insert


【解决方案1】:

您需要完成迭代以及插入。假设您正在实现一个链接列表,并且您在 ListElement 类中有一个公共 next 属性。

public boolean insert(Person p){
        ListElement element = new StackElement(p);
        boolean inserted = false;
        if(head == null){
            head = element;
            size = size + 1;
            inserted = true;
            return inserted;
        }
        ListElement temp = head;
        ListElement prev = null;
        while(temp != null){
            if(temp.compareTo(element) < 0) {
                    if(prev != null) prev.next = element; //Keep the chain connected
                    element.next = temp; //Insert you element before temp
                    inserted = true;
                    break; 
                }
                prev = temp;
                temp = temp.next;
            }
        }
        if(!inserted && temp == null && prev != null) { //You may want to insert it at the end of the list if no upper element is found.
                 prev.next = element; //Put it at the end.
                 inserted = true;
        }
       if(inserted) size = size + 1;
       return inserted; //This should be true in any case but I left it for the case you want to avoid inserting the element at the end if its place is not found.
    }

ListElement.next 也可以是私有或受保护的属性,可以通过像 getNext() 这样的 getter 访问。

我认为你不应该返回 inserted 值,因为如果元素不能放在任何其他元素之前,它应该放在列表的末尾,因此总是被插入。也就是说,这段代码是排序列表的更好实现:

public void insert(Person p){
        ListElement element = new StackElement(p);

        if(head == null){
            head = element;
            size = size + 1;
            return;
        }

        ListElement temp = head;
        ListElement prev = null;

        boolean inserted = false;
        while(temp != null){
            if(temp.compareTo(element) < 0) {
                    if(prev != null) prev.next = element; //Keep the chain connected
                    element.next = temp; //Insert you element before temp
                    inserted = true;
                    temp = null;
                } else {
                    prev = temp;
                    temp = temp.next;
                }
            }
        }
        if(!inserted && prev != null)
        { 
                 prev.next = element; //Put it at the end.
        }
       size = size + 1;
    }

关于你的delete 方法,我认为你把事情弄得太复杂了。 在您的迭代中,您只需要保留两个引用:一个用于前一个元素,另一个用于当前元素。 如果您的第一个元素是要删除的元素,那么您的prev 引用将是null,您必须更新head。否则,您需要更新 prev 下一个引用,使其引用 current 之后的元素:

public boolean delete(Person p){
    boolean deleted = false;
    PersonListElement current = head;
    PersonListElement prev = null;
    while(current != null && !deleted){
        if(current.getValue().compareTo(p) == 0){
            if(prev != null) 
                prev.setNext(current.getNext());
            else
                head = current.getNext();
            deleted = true;
        } else {
        prev = current;
        current = current.getNext();
       }
    }
    if(deleted) size--;
    return deleted;
}

【讨论】:

  • 我无法理解这里的代码:if(prev != null) prev.next = element; //保持链连接 element.next = temp; //在temp之前插入你的元素插入=真;临时=空; } 上一页 = 温度; temp = temp.next;你能帮帮我吗?
  • @usersuper prev 保留对temp 之前节点的引用。您询问的if 句子用于检查是否存在前一个元素,在这种情况下,您必须将元素放在它之后(通过使其属性next 引用element)并且在任何情况下就在temp 之前(通过使element.next 引用temp)。现在清楚了吗?
  • 我接受了你的回答。我还有一个关于删除元素的问题。我试图做到这一点,但我认为如果元素位于列表末尾,我的代码将不起作用。我的代码在下面
  • 好的,我删除了我的答案。
  • 如果我想删除最后一个元素,我不确定你的删除方法是否有效,因为 if(prev != null) { prev.setNext(current.getNext()); }。然后 prev 我认为这可能有问题,因为 current.getNext() 不存在
猜你喜欢
  • 2014-03-15
  • 2012-11-26
  • 1970-01-01
  • 2011-12-25
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
相关资源
最近更新 更多