Использование LinkedList и ListIterator для возврата элементов в алфавитном порядке - PullRequest
0 голосов
/ 25 января 2020

Функция 'addInOrder' должна добавлять элементы String (названия городов Австралии) в алфавитном порядке в LinkedList 'placeToVisit'.

И в соответствии с уроком, которому я следовал, функция 'addInOrder' фактически работала как задумано. Тем не менее, функция была написана таким образом, чтобы возвращать логическое значение, которое равно private static boolean addInOrder(LinkedList<String> linkedList, String newCity) {}.

Но я хотел поэкспериментировать и решил написать функцию 'addInOrder' для возврата void, а это private static void addInOrder(LinkedList<String> linkedList, String newCity) {} ,

Но выходные данные не возвращались в алфавитном порядке, и были даже дубликаты, несмотря на использование ключевого слова break в то время как l oop.

Исходный код в соответствии с руководством был:

   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) {
                System.out.println(newCity + " already listed as destination.");
                return false;
            } else if (comparison > 0) {
                stringListIterator.previous();
                stringListIterator.add(newCity);
                return true;
            }
        }
        stringListIterator.add(newCity);
        return true;
     }

Выход:

Now visiting, Adelaide
Now visiting, Brisbane
Now visiting, Canberra
Now visiting, Darwin
Now visiting, Melbourne
Now visiting, Perth
Now visiting, Sydney

Мой код:

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

    if (linkedList.size() == 0) {
        linkedList.add(newCity);
    } else {
        while (stringListIterator.hasNext()) {
            int comparison = stringListIterator.next().compareTo(newCity);
            if (comparison == 0) {
                System.out.println(newCity + " already listed as destination.");
                break;
            } else if (comparison > 0) {
                stringListIterator.previous();
                stringListIterator.add(newCity);
                break;
            } else if (comparison < 0) {
                stringListIterator.add(newCity);
                break;
            }
        }
        linkedList.addLast(newCity);
    }

}
} 

Выход:

Now visiting, Adelaide
Now visiting, Darwin
Now visiting, Brisbane
Now visiting, Canberra
Now visiting, Perth
Now visiting, Melbourne
Now visiting, Sydney
Now visiting, Melbourne
Now visiting, Brisbane
Now visiting, Perth
Now visiting, Canberra
Now visiting, Adelaide
Now visiting, Darwin

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Вы добавляете каждый город дважды. Сначала вы добавляете его в l oop как раз перед break. Затем вы добавляете его в конец списка после l oop, в этой строке:

    linkedList.addLast(newCity);

Вы также заметите, что последняя половина ваших выходных данных - это именно ваши города в том порядке, в каком вы вставил их.

break слабее, чем return. break продолжает выполнение после l oop, в то время как return полностью завершает метод.

Редактировать: У вас есть еще одна проблема: вы не добавляете по порядку. Если список не пуст, ваша цепочка if / else будет всегда найти один истинный случай. Это означает, что если добавляемый город уже не является первым в списке (!), Вы добавите его либо до, либо после первого элемента, но не позднее.

  1. Сидней заходит в пустой список Как единственный город, он добавляется только один раз.
  2. Мельбурн добавляется до Сиднея (правильно) и в конце (неверно).
  3. Брисбен добавляется до Мельбурна и в конце.
  4. Перт добавляется после Брисбена (неверно) и в конце (также неверно)
  5. Канберра добавляется после Брисбена и в конце.
  6. Аделаида добавляется до Брисбена и в end.
  7. Darwin добавляется после Adelaide и в конце.

В качестве дополнительного кода для производственного кода я предпочел бы использовать ArrayList вместо LinkedList. Если было введено 100 000 городов, то в ArrayList может стать слишком дорого. Если это так, я просто вставлю в конец и отсортирую список после добавления всех городов.

1 голос
/ 26 января 2020

После исправлений, опубликованных участником (Ole VV): «break слабее, чем return. Break продолжает выполнение после l oop, в то время как return полностью завершает метод».

Я просмотрел код:

private static void addInOrder(LinkedList<String> linkedList, String newCity) {
    ListIterator<String> stringListIterator = linkedList.listIterator();

    if (linkedList.size() != 0) {
        while (stringListIterator.hasNext()) {
            int comparison = stringListIterator.next().compareTo(newCity);
            if (comparison == 0) {
                System.out.println(newCity + " already listed as destination.");
                return; //return keyword is used instead of break keyword to exit the method
            } else if (comparison > 0) {
                stringListIterator.previous();
                stringListIterator.add(newCity);
                return; //return keyword is used instead of break keyword to exit the method
            }
        }
    }
    stringListIterator.add(newCity);
}
...