【问题标题】:Enhanced for loop for Strings增强了字符串的 for 循环
【发布时间】:2019-05-23 12:29:43
【问题描述】:

我是编码的初学者。目前我正在学习数组。

在下面的代码中,我尝试使用String 数组显示用户输入的单词。使用增强的 for 循环时,代码显示 null。谁能解释一下这个问题?

代码在正常的 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 而不是单词。

【问题讨论】:

  • 作为初学者,我假设您还没有了解ArrayList。当你学习它时,你会发现ArrayList 在这种情况下比数组更适合。当您不确切知道需要多少元素时使用它。
  • @DodgyCodeException 是的,然后还有链表。此时选择正确的列表非常令人困惑。
  • 这是一个基于性能的决定。在大多数情况下,ArrayList 会更快。不要太担心它。现在只需使用 ArrayList。如果您在某个时候开始编写对性能至关重要的应用程序,那么您可能会知道如何衡量性能以确定哪个是最好的。

标签: java arrays for-loop


【解决方案1】:

增强的 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
    }
}

【讨论】:

    【解决方案2】:

    您已经创建了一个包含 100 个条目的数组。最初,所有 100 个都是空的。然后,您的 do/while 循环会填充其中的一些。当然,多少取决于用户。

    但是,您正在打印数组的所有 100 个条目。你会看到几个词,然后是很多空值。您最好只打印 为空的条目,像这样。

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

    【讨论】:

      【解决方案3】:

      如果您仔细观察,它会打印用户输入的单词。您看到的是null,因为您的数组大小为 100。

      String[] words = new String[100];
      

      在您的控制台中向上滚动以查看用户最初输入的名称。您会看到 nulls,因为数组中的剩余元素是 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 2011-01-20
        • 1970-01-01
        • 2021-06-10
        • 2012-08-22
        • 1970-01-01
        相关资源
        最近更新 更多