LinkedList Java:迭代器卡在第一个节点

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

该程序不会迭代添加的整个城镇列表。卡在链表的索引 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);
    }
}

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

java linked-list
1个回答
1
投票

首先,题外话。我会将

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

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

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

您应该让您的方法采用

Iterator
参数而不是
List

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