按名称对排序的LinkedList进行排序

时间:2014-05-10 02:00:33

标签: java sorting linked-list

如果标题不够混乱,也许这就是。我有一个链表,其中包含姓名和其他一些变量的人。列表必须先按姓氏排序,然后按名字排序。到目前为止,我按照姓氏的字母顺序将人员插入列表中。然后我尝试遍历列表,如果两个姓氏相同,我检查名字和交换。但我有一个错误。

Inserted alphabetically into the list by last name, last,first
Acy,Mary
Acy,Clayton
Bob,Lonnie
Toni,Lonnie

After my so call "sort" of first names
Acy,Mary
Bob,Lonnie
Acy,Clayton
Toni,Lonnie

您可以看到它按姓氏排序。我试图用名字对每个相同的姓氏进行排序。这就是我从

输出的结果
 public void sortFirstNames(){
     System.out.println("here");
     PeopleNode previous = null;
     PeopleNode current = head; 
     PeopleNode temp;

     if(head == null || head.next == null){
         return;
     }

    while(current != null && current.next != null && current.lastName.compareTo(current.next.lastName) == 0){ //traverse the list 
            if((current.firstName).compareTo(current.next.firstName) > 0){ //see which first name goes first 
                temp = current.next.next;
                current.next.next = temp.next;
                temp.next = current.next;
                current.next = temp;
                current = temp.next;
             }
            current = current.next;
        }
     }

它根本没有改变列表,我已经采纳了评论者的建议,但尚未使其成功。有谁有想法吗?

基本上我想说的是,虽然两个姓氏相同,但检查名字,然后根据需要交换它们。

1 个答案:

答案 0 :(得分:1)

问题的核心在于:

if(previous.firstName.compareTo(current.firstName) >= 0){
    temp = current;
    current = previous;
    previous = temp;
}

首先 - >=。这可能不是一个问题,只是不必要 - 没有必要交换相同的元素 - 只需改为>

接下来,该代码根本不会更改链接列表。它只是更改局部变量的值,因此previous最终指向实际链表中 current之后的节点,然后,因为>=,如果你有相同的值,你将只是连续处理相同的两个节点。

这篇文章详细阐述了:Is Java "pass-by-reference" or "pass-by-value"?

您需要做的是比较something.nextsomething.next.next(不需要2个单独的变量),然后您可以交换这些,这将更改链接列表。