Почему мой итератор списка должен возвращаться, пока l oop? - PullRequest
0 голосов
/ 02 апреля 2020

Что делает этот код, так это то, что я просто добавляю разные имена к своему linkedlist, и он изменяет список в алфавитном порядке. Я бы добавил что-то вроде addInOrder(list,"Sacramento") и addInOrder(list,"Sacramento"). Как вы можете себе представить, он упорядочивает их по алфавиту. проблема в том, что мой код, приведенный ниже, с оператором return не добавляет элементы в мой список, а когда я его запускаю, он просто не выполняется. Может кто-нибудь объяснить мне, почему return на это нужно? Я не могу найти примеры этого где-либо еще. ниже приведены примеры.

Этот код работает, обратите внимание на return:

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 + " is already included as a destination");
                    return false;
          } else if(comparison > 0) {
              stringListIterator.previous();
              stringListIterator.add(newCity);
                    return true;
          } else if(comparison < 0) {
                    // move on next city
              }
          }
    stringListIterator.add(newCity);
    return true;
}

Этот 2-й блок кода также работает:

       public static void addinOrder(LinkedList<String> cities,String newInput){
         ListIterator<String> lList1 = cities.listIterator();
            while(lList1.hasNext()){
                int comparison = lList1.next().compareTo(newInput);
                if(comparison==0){
                    System.out.println("Input already in here");
                return;
                }else if(comparison>0){
                    lList1.previous();
                    lList1.add(newInput);
                    return;
                }else if(comparison<0){

                }

            }
            lList1.add(newInput);
        }

, но для некоторых причина: Этот блок кода не работает, единственное отличие - я удаляю return:

           public static void addinOrder(LinkedList<String> cities,String newInput){
         ListIterator<String> lList1 = cities.listIterator();
            while(lList1.hasNext()){
                int comparison = lList1.next().compareTo(newInput);
                if(comparison==0){
                    System.out.println("Input already in here");

                }else if(comparison>0){
                    lList1.previous();
                    lList1.add(newInput);

                }else if(comparison<0){

                }

            }
            lList1.add(newInput);

        }

1 Ответ

0 голосов
/ 02 апреля 2020

Если под "действующим странно" вы имеете в виду, что ваш последний фрагмент иногда добавляет newInput дважды, это происходит из-за того, что у вас есть два lList1.add(newInput) оператора - первый находится внутри условия, а второй - последний оператор метода .

Когда вы добавляете оператор return после первого оператора lList1.add(newInput), вы также предотвращаете выполнение второго lList1.add(newInput), поэтому убедитесь, что выполняется только одна вставка.

Если вы используете sh, вы можете использовать флаг boolean вместо оператора return:

public static void addinOrder(LinkedList<String> cities,String newInput){
    ListIterator<String> lList1 = cities.listIterator();
    boolean added = false;
    while (lList1.hasNext() && !added) {
        int comparison = lList1.next().compareTo(newInput);
        if (comparison==0) {
            System.out.println("Input already in here");
            added = true; // assuming you don't want to add the same input again
        } else if(comparison>0) {
            lList1.previous();
            lList1.add(newInput);
            added = true;
        }
    }
    if (!added) {
        lList1.add(newInput);
    }
}
...