Улучшено для цикла для строк - PullRequest
0 голосов
/ 24 декабря 2018

Я новичок в кодировании.В настоящее время я изучаю массивы.

В следующем коде я пытаюсь отобразить слова, введенные пользователем, с использованием массива String.Код отображает null при использовании расширенного цикла for.Кто-нибудь может объяснить проблему?

Код работает нормально с обычным циклом for.

public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    String word;
    int count = 0;

    String[] words = new String[100];

    System.out.println("Enter the words (enter 'done' when finished):");

    do {
        System.out.println("Enter word "+ (count+1));
        word=scanner.nextLine();

        if (!word.equalsIgnoreCase("done")) {
            words[count]=word;
            count++;
        }
    }while (!word.equalsIgnoreCase("done"));

    System.out.println("Words entered are:");

    for (String print:words){
        System.out.println(print);
    }

    scanner.close();
}

Код должен отображать слова, введенные пользователем, но вместо этого он отображает nullслова.

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Вы создали массив из 100 записей.Первоначально все 100 из них являются нулевыми.Затем ваш цикл do / while заполняет некоторые из них.Конечно, сколько зависит от пользователя.

Но тогда вы печатаете все 100 записей массива.Вы увидите несколько слов, а затем множество нулей.Возможно, вам лучше распечатать только те записи, которые не являются нулевыми, например,

for (String print:words){
    if (print != null) {
        System.out.println(print);
    }
}
0 голосов
/ 24 декабря 2018

Усовершенствованный цикл for в этом случае не подходит, поскольку он печатает все 100 элементов массива, большинство из которых, вероятно, null.

Когда вы используете регулярный цикл for, вы беретеПреимущество переменной count, которая позволяет печатать только инициализированные элементы массива:

for (int i = 0; i < count; i++) {
    System.out.println(words[i]);
}

Если вы настаиваете на использовании расширенного цикла for, вы можете проверить наличие элементов null и разбитьиз цикла, когда вы сталкиваетесь с первым:

for (String print:words){
    if (print != null) {
        System.out.println(print);
    } else {
        break; // once you encountered the first null, there's no point to continue the loop
    }
}
0 голосов
/ 24 декабря 2018

Если вы посмотрите внимательно, он напечатает слова, введенные пользователем.Вы видите null, потому что размер вашего массива равен 100.

String[] words = new String[100];

Прокрутите вверх в консоли, чтобы увидеть имена, первоначально введенные пользователем.Вы видите ноль , потому что остальные элементы в массиве null.Например, если пользователь вводит 5 слов , остальные 95 слов в массиве равны null.

. Вы можете добавить нулевую проверку, чтобы распечатать тольконенулевые значения.

for (String print : words) {
    if (print != null) {
        System.out.println(print);
    }
}

Если вы используете java-8, вы можете просто сделать:

Arrays.stream(words).filter(Objects::nonNull).forEach(System.out::println);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...