Java 链表

问题描述 投票:0回答:1

该程序不会迭代添加的整个城镇列表。卡在链表的索引 1 处,该索引按升序排列。

我尝试通过调用 previous() 或 next() 方法来移动链表的光标。 下面是由两个类组成的代码。

导入java.util.LinkedList; 导入 java.util.Scanner;

公开课主课{

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);
}

}

公共课 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);
}

}

运行程序时,前进和后退方法不会执行。向后方法根本不执行。

java linked-list
1个回答
0
投票

首先,题外话。我会将

LinkedList
替换为
ArrayList
,因为它效率更高,并且在
 很少的应用中 
LinkedList
 更好。您会发现很少有专业编写的应用程序使用 
LinkedList
。另外,尽可能使用界面 
List

列表的迭代器不会更改其来源列表的任何内容。因此,当您调用

list.listIterator()
时,它会返回一个指向第一个元素的全新迭代器,而不是您先前的迭代器指向的最后一个元素。

您应该让您的方法采用

Iterator
参数而不是
List

© www.soinside.com 2019 - 2024. All rights reserved.