[英]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.