该程序不会迭代添加的整个城镇列表。卡在链表的索引 1 处,该索引按升序排列。
我尝试通过调用 previous() 或 next() 方法来移动链表的光标。 下面是由两个类组成的代码。
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
var places = new LinkedList<PlacesToVisit>();
addPlaces(places, new PlacesToVisit("Adelaide", 1374));
addPlaces(places, new PlacesToVisit("Brisbane", 917));
addPlaces(places, new PlacesToVisit("Perth", 3923));
addPlaces(places, new PlacesToVisit("Alice Springs", 2771));
addPlaces(places, new PlacesToVisit("Darwin", 3723));
addPlaces(places, new PlacesToVisit("Melbourne", 877));
addPlaces(places, new PlacesToVisit("Sydney", 0));
System.out.println("First place to go is " + places.getFirst());
boolean flag = true;
while (flag) {
Scanner sc = new Scanner(System.in);
chooseOptions();
switch (sc.next().toUpperCase().substring(0, 1)) {
case "M" -> printMenu(places);
case "F" -> moveForward(places);
case "B" -> moveBack(places);
case "L" -> System.out.println(places);
case "Q" -> flag = false;
}
}
}
private static void chooseOptions() {
String options = ("""
Available actions (Select word or letter)
(F)orward
(B)acward
(M)enu
(L)ist places
(Q)uit""");
System.out.println(options + " ");
}
private static void printMenu(LinkedList<PlacesToVisit> list) {
System.out.println(list);
}
private static void moveForward(LinkedList<PlacesToVisit> list) {
var iterator = list.listIterator();
if (iterator.hasNext()) {
iterator.next();
if (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
private static void moveBack(LinkedList<PlacesToVisit> list) {
var iterator = list.listIterator();
if (iterator.hasPrevious()) {
iterator.previous();
if (iterator.hasPrevious()) {
System.out.println(iterator.previous());
}
}
}
private static void addPlaces(LinkedList<PlacesToVisit> list, PlacesToVisit place) {
if (list.contains(place)) {
System.out.println("Found duplicate " + place);
return;
}
for (PlacesToVisit p : list) {
if (p.getName().equalsIgnoreCase(place.getName())) {
System.out.println("Duplicate found" + place);
return;
}
}
int matchIndex = 0;
for (var listPlace : list) {
if (place.getDistance() < listPlace.getDistance()) {
list.add(matchIndex, place);
return;
}
matchIndex++;
}
list.add(place);
}
}
public class PlacesToVisit {
private String name;
private int distance;
public PlacesToVisit(String name, int distance) {
this.name = name;
this.distance = distance;
}
public String getName() {
return name;
}
public int getDistance() {
return distance;
}
@Override
public String toString() {
return String.format("%s distance = %d", name, distance);
}
}
运行程序时,前进和后退方法不会执行。向后方法根本不执行。
首先,题外话。我会将
LinkedList
替换为 ArrayList
,因为它效率更高,并且在 很少的应用中
LinkedList
更好。您会发现很少有专业编写的应用程序使用
LinkedList
。另外,尽可能使用界面
List
。列表的迭代器不会更改其来源列表的任何内容。因此,当您调用
list.listIterator()
时,它会返回一个指向第一个元素的全新迭代器,而不是您先前的迭代器指向的最后一个元素。
您应该让您的方法采用
Iterator
参数而不是 List
。