Условие While всегда ложно, но код все еще выполняется !? Java magic?

#java #arraylist #while-loop

#java #arraylist #цикл while

Вопрос:

 import java.util.ArrayList;
import java.util.Scanner;

public class WordProblem {
    public static void main(String[] args) {
        ArrayList<String> words = new ArrayList<>();
        String[] wordsToAdd = {"cat", "dog", "horse", "zebra"};

        for (int i = 0; i < 4; i  ) {
            words.add(wordsToAdd[i]);

        }
        Scanner keyboard = new Scanner(System.in);
        String newWord = keyboard.next();

        int x = 0;
        while (newWord.compareToIgnoreCase(words.get(x)) > 0 amp;amp; 
        x < words.size()) {
        x  ;
        }
        words.add(x, newWord);


        for (String string : words) {
            System.out.println(string);
        }
        keyboard.close();
    }
}
  

следующий код имеет смысл, если слово, введенное пользователем, по крайней мере, больше первого слова в arraylist(«cat»).

однако, когда я ввожу «ant», он все еще работает и помещает «ant» в индекс 0. насколько я вижу, когда введенное слово дает отрицательный int, в случае ant vs cat это -2. как он выходит из цикла и как он помещает ant в индекс 0?

любая помощь будет с благодарностью принята.

Комментарии:

1. Вы пробовали использовать отладчик для пошагового выполнения вашего кода?

2. X начинается с нуля. Если цикл не введен, он остается там и добавляется в начале.

3. Нет ничего, что называется «java magic». Java — это язык программирования, который подчиняется строгим правилам. Если бы существовала «java magic», мы никогда не смогли бы гарантировать, как будет работать программа, что может привести к сбоям в производстве.

4. Я не знаю, какова цель вашей программы, но «ant» не удовлетворяет первому условию. compareToIgnoreCase() возвращает число меньше 0, если первая строка лексикографически меньше другой строки. Поскольку «ant» меньше, чем «cat», это нарушит условие.

Ответ №1:

Цикл while никогда не вводится, поэтому следующая строка после цикла выполняется немедленно. Если мы вырежем цикл while из вашей программы, останется следующее:

 int x = 0;
words.add(x, newWord);
  

Таким образом, слово добавляется в начало списка.

следующий код имеет смысл, если слово, введенное пользователем, по крайней мере, больше первого слова в arraylist(«cat»).

Нет, compareToIgnoreCase сравнивает содержимое строки, игнорируя регистр, и не сравнивает длину. Если вы хотите упорядочить слова по длине, вам нужно сравнить их длину, а не то, какие буквы они содержат.

Комментарии:

1. Большое вам спасибо. Я не знаю, как я забыл, что циклы while выполняются только при выполнении условий. Пожалуйста, простите новичка и спасибо всем за вклад.