我在理解下面的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 { ... }