gpt4 book ai didi

java - 按名称对已排序的 LinkedList 进行排序

转载 作者:行者123 更新时间:2023-12-01 13:00:03 24 4
gpt4 key购买 nike

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

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;
}
}

它根本不会改变列表,我已经听取了评论者的建议,但尚未使其发挥作用。有人有什么主意吗?

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

最佳答案

问题的核心在于:

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

首先 - >=。这可能不是一个问题,而是不必要的 - 不需要交换相等的元素 - 只需将其改为 > 即可。

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

这篇文章对此进行了一些详细阐述:Is Java "pass-by-reference" or "pass-by-value"?

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

关于java - 按名称对已排序的 LinkedList 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23576374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com