[英]Using a LinkedList And ListIterator to return elements in alphabetical order
函数 'addInOrder' 应该按字母顺序将字符串元素(澳大利亚城市的名称)添加到 LinkedList 'placesToVisit'。
根据我遵循的教程,“addInOrder”函数实际上按预期工作。 但是,该函数是以返回布尔值的方式编写的,它是private static boolean addInOrder(LinkedList<String> linkedList, String newCity) {}
。
但我想尝试并决定编写函数 'addInOrder' 来返回 void ,它是private static void addInOrder(LinkedList<String> linkedList, String newCity) {}
。
但是输出没有按字母顺序返回,尽管在 while 循环中使用了 'break' 关键字,甚至还有重复。
根据教程的原始代码是:
private static boolean addInOrder(LinkedList<String> linkedList, String newCity) {
ListIterator<String> stringListIterator = linkedList.listIterator();
while (stringListIterator.hasNext()) {
int comparison = stringListIterator.next().compareTo(newCity);
if (comparison == 0) {
System.out.println(newCity + " already listed as destination.");
return false;
} else if (comparison > 0) {
stringListIterator.previous();
stringListIterator.add(newCity);
return true;
}
}
stringListIterator.add(newCity);
return true;
}
输出:
Now visiting, Adelaide
Now visiting, Brisbane
Now visiting, Canberra
Now visiting, Darwin
Now visiting, Melbourne
Now visiting, Perth
Now visiting, Sydney
我的代码:
public class Demo {
public static void main(String[] args) {
LinkedList<String> placesToVisit = new LinkedList<>();
addInOrder(placesToVisit, "Sydney");
addInOrder(placesToVisit, "Melbourne");
addInOrder(placesToVisit, "Brisbane");
addInOrder(placesToVisit, "Perth");
addInOrder(placesToVisit, "Canberra");
addInOrder(placesToVisit, "Adelaide");
addInOrder(placesToVisit, "Darwin");
printList(placesToVisit);
}
private static void printList(LinkedList<String> linkedList) {
Iterator<String> i = linkedList.iterator();
while (i.hasNext()) {
System.out.println("Now visiting, " + i.next());
}
System.out.println("=============================");
}
private static void addInOrder(LinkedList<String> linkedList, String newCity) {
ListIterator<String> stringListIterator = linkedList.listIterator();
if (linkedList.size() == 0) {
linkedList.add(newCity);
} else {
while (stringListIterator.hasNext()) {
int comparison = stringListIterator.next().compareTo(newCity);
if (comparison == 0) {
System.out.println(newCity + " already listed as destination.");
break;
} else if (comparison > 0) {
stringListIterator.previous();
stringListIterator.add(newCity);
break;
} else if (comparison < 0) {
stringListIterator.add(newCity);
break;
}
}
linkedList.addLast(newCity);
}
}
}
输出:
Now visiting, Adelaide
Now visiting, Darwin
Now visiting, Brisbane
Now visiting, Canberra
Now visiting, Perth
Now visiting, Melbourne
Now visiting, Sydney
Now visiting, Melbourne
Now visiting, Brisbane
Now visiting, Perth
Now visiting, Canberra
Now visiting, Adelaide
Now visiting, Darwin
您将每个城市添加两次。 首先,您在break
之前将它添加到循环中。 然后将它添加到循环后列表的末尾,在这一行中:
linkedList.addLast(newCity);
您还会注意到,输出的后半部分正是您插入城市的顺序。
break
比return
弱。 break
在循环后继续执行,而return
完全退出该方法。
编辑:您还有一个问题:您没有按顺序添加。 如果列表非空,则您的if
/ else
链将始终找到一个真实案例。 这意味着除非要添加的城市已经是列表中的第一个(!),否则您将在第一个元素之前或之后添加它,而不是稍后。
ArrayList
说LinkedList
,对于生产代码,我更喜欢使用ArrayList
而不是LinkedList
。 如果有 100 000 个城市按顺序插入ArrayList
可能会变得非常昂贵。 如果是这样,我只会在最后插入并在添加所有城市后对列表进行排序。
在贡献者 (Ole VV) 发布更正后:“break 比 return 弱。break 在循环后继续执行,而 return 完全退出方法。”
我查看了代码:
private static void addInOrder(LinkedList<String> linkedList, String newCity) {
ListIterator<String> stringListIterator = linkedList.listIterator();
if (linkedList.size() != 0) {
while (stringListIterator.hasNext()) {
int comparison = stringListIterator.next().compareTo(newCity);
if (comparison == 0) {
System.out.println(newCity + " already listed as destination.");
return; //return keyword is used instead of break keyword to exit the method
} else if (comparison > 0) {
stringListIterator.previous();
stringListIterator.add(newCity);
return; //return keyword is used instead of break keyword to exit the method
}
}
}
stringListIterator.add(newCity);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.