我在理解下面的addInOrder()方法的while循环时遇到了问题,因为listIterator使用了compareTo()方法。我将在下面发布代码以及我不了解的部分。

public class Demo {
    public static void main(String[] args) {
        LinkedList<String> placesToVisit = new LinkedList<String>();
        placesToVisit.add("Sydney");
        placesToVisit.add("Melbourne");
        placesToVisit.add("Brisbane");
        placesToVisit.add("Perth");
        placesToVisit.add("Canberra");
        placesToVisit.add("Adelaide");
        placesToVisit.add("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 boolean addInOrder(LinkedList<String> linkedList, String newCity) {
        ListIterator<String> stringListIterator = linkedList.listIterator();

        while(stringListIterator.hasNext()) {
            int comparison = stringListIterator.next().compareTo(newCity);
            if(comparison == 0) { // equal, do not add
                System.out.println(newCity + " is already included as a destination");
                return false;
            } else if(comparison > 0) { // new City should appear before this one
                stringListIterator.previous();
                stringListIterator.add(newCity);
                return true;
            } else if(comparison < 0) {
                // move on next city
            }
         }

        stringListIterator.add(newCity); //adds a city in case the linkedList passed as a parameter is empty.
        return true;
    }


因此,谈论addInOrder方法。我知道声明了ListIterator stringListIterator = linkedList.listIterator(); ,迭代器的光标将位于链接列表的第一个元素之前,在该示例之后是悉尼。

假设添加到链接列表中的城市顺序是主要方法中使用的城市顺序:悉尼,墨尔本,布里斯班,珀斯,堪培拉,阿德莱德和达尔文。

现在,关于while循环:第int行比较= stringListIterator.next()。compareTo(newCity);将光标移动到第一个元素(悉尼)之后,它将把悉尼与newCity参数进行比较。假设我要传递的newCity参数是Adelaide。它将比较悉尼和阿德莱德,比较之后将得出18,因为悉尼“比”阿德莱德“大”,因此它将进入else if(comparison> 0)条件;

通过声明:stringListIterator.previous();光标将返回到初始位置,这意味着在第一个元素悉尼之前。第二行,stringListIterator.add(newCity);在我的案例中,将把Adelaide添加为linkedList的第一个元素,之后是Sydney。

我的问题就在那之后:因为它是一个while循环,它将重新执行代码,但是这给我带来了问题:通过再次到达int comparison = stringListIterator.next()。compareTo(newCity); ,光标将位于何处?它会从悉尼和墨尔本之间迁移到墨尔本和布里斯班之间吗?如果是这样,则将墨尔本与newCity参数进行比较(如我上文所述,引入阿德莱德),因为墨尔本“比”阿德莱德“大”,结果为12,这将再次检查条件if(comparison> 0),它将输入因此,stringListIterator.previous();会在悉尼和墨尔本之间移动光标,再次添加阿德莱德(如第一次比较)?我知道我的逻辑中缺少某些内容,因为该代码实际上按字母顺序对所有城市进行排序(这是代码的目的),但是我在哪里出错?请帮助我,在此先感谢!

最佳答案

你是对的;直到您写出“再次到达int comparison = stringListIterator.next().compareTo(newCity);”(已加强调)

如果您学习else if,请注意有一个return true。这意味着您不会再次到达。

...
} else if(comparison > 0) { // new City should appear before this one
   stringListIterator.previous();
   stringListIterator.add(newCity);
   return true;
} else { ... }

09-28 07:19