簡體   English   中英

使用 LinkedList 和 ListIterator 按字母順序返回元素

[英]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);

您還會注意到,輸出的后半部分正是您插入城市的順序。

breakreturn弱。 break在循環后繼續執行,而return完全退出該方法。

編輯:您還有一個問題:您沒有按順序添加。 如果列表非空,則您的if / else鏈將始終找到一個真實案例。 這意味着除非要添加的城市已經是列表中的第一個(!),否則您將在第一個元素之前或之后添加它,而不是稍后。

  1. 悉尼進入一個空列表。 作為唯一的城市,它只添加一次。
  2. 在悉尼(正確)和最后(不正確)添加墨爾本。
  3. 在墨爾本之前和最后添加布里斯班。
  4. 珀斯加在布里斯班之后(不正確)和最后(也不正確)
  5. 堪培拉是在布里斯班之后和最后加入的。
  6. 阿德萊德添加在布里斯班之前和末尾。
  7. 達爾文是在阿德萊德之后和最后添加的。

ArrayListLinkedList ,對於生產代碼,我更喜歡使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM