Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有人能帮我理解为什么我需要一个IF和WHILE来回答这个问题吗?_Java - Fatal编程技术网

Java 有人能帮我理解为什么我需要一个IF和WHILE来回答这个问题吗?

Java 有人能帮我理解为什么我需要一个IF和WHILE来回答这个问题吗?,java,Java,快速问题-我已经找到了这个测验问题的正确答案,但我不完全理解 这是一个问题- if(input.hasNext()) System.out.print(input.nextLine()); while (input.hasNext()){ System.out.print(" " + input.nextLine()); } } 给定一个名为input的扫描器参考变量,该变量与一个由一系列行组成的输入源相关联,编写读入每一行所需的代码,并将它们全部打印在

快速问题-我已经找到了这个测验问题的正确答案,但我不完全理解

这是一个问题-

if(input.hasNext())
    System.out.print(input.nextLine());
    while (input.hasNext()){
        System.out.print(" " + input.nextLine());
    }
}
给定一个名为input的扫描器参考变量,该变量与一个由一系列行组成的输入源相关联,编写读入每一行所需的代码,并将它们全部打印在一行上,以空格分隔

以下是答案-

if(input.hasNext())
    System.out.print(input.nextLine());
    while (input.hasNext()){
        System.out.print(" " + input.nextLine());
    }
}
我的问题是,为什么需要if和while语句。我知道我需要先读这行,然后再打印出来。为什么只有:

while(input.hasNext()){
    System.out.print(" " + input.nextLine());
}

谢谢

唯一明显的区别是正确答案不会产生以空格开头的输出

使用此文件:

foo
bar
baz
您的代码将有以下输出(注意“foo”前面的空格):

答案的代码将有以下内容(在“foo”前面没有空格):


问题是输出将以空格开头。 您可以将空格放在末尾,这样就可以了:

System.out.print(input.nextLine() + " ");
如果这仍然会导致问题,那么这可能会起作用:

while(input.hasNext()){
    System.out.print(input.nextLine());

    if(input.hasNext())
        System.out.print(" ");
}

我还没有测试过它,但除了最后一行之外,它应该在每一行都添加一个空格。

这里有另一种方法(我找不到我最初看到类似用法的地方):


唯一的尊重是在第一个代码中

if(input.hasNext())
    System.out.print(input.nextLine());
    while (input.hasNext()){
        System.out.print(" " + input.nextLine());
    }
}
您将打印“-space”-然后是字符串,但在第二行中,您将从行的开头开始,然后它将在单词之间放置空格 所以

“空间”第一第二第三

尊重

第一个第二个第三个//第一个没有空格


从集合中创建带分隔符的字符串时遇到的一个常见问题是如何避免多余的前导或尾随空间。这就是额外的if语句实现的功能。还有其他几种方法可以解决这个问题,下面我提供两种选择

您也可以这样做:

// first build the output string using a StringBuilder
StringBuilder sb = new StringBuilder();
while(input.hasNext()) {
    sb.append(input.nextLine()).append(" ");      
}    
// if there was input, the StringBuilder will have an extra space at the end
if (sb.length() > 0) {
    // in that case remove the space and print the result
    sb.deleteCharAt(sb.length() - 1);
    System.out.println(sb);
}
或者更有趣的是,递归解决方案:

private String read(Scanner input) {
    if (!input.hasNext()) {
        return "";
    }
    String head = input.nextLine();
    if (input.hasNext()) {            
        return head + " " + read(input);
    }
    else {
        return head;
    }
}

第一个示例不打印前导空格,第二个示例打印前导空格。您可以使用三元运算替换
IF
,以达到相同的效果,但如果问题是基本问题,则不一定更易于阅读,它写得很好,也很具体。因为前导空格使其输出错误,所以使用他的代码是不够的。这并不能回答问题。它只是提供了一个替代解决方案。它扩展了顶部评论中已经提供的答案,提供了一种解决分隔符问题的替代方法。我喜欢这个解决方案,但它丑陋的一面是,您不必要地在每个分隔符上重新分配分隔符iteration@AdriaanKoster问题不在于寻求解决方案。问题是为什么提出的解决方案不是一个好答案。这个答案提供了其他问题的答案,而不是这个问题。虽然提供另一种解决方案作为回答的一部分当然是一件好事,但提供一个不回答问题的替代方案是根据定义而不是回答问题。谢谢您的时间,欢迎您,请考虑将您的问题标记为回答。
// first build the output string using a StringBuilder
StringBuilder sb = new StringBuilder();
while(input.hasNext()) {
    sb.append(input.nextLine()).append(" ");      
}    
// if there was input, the StringBuilder will have an extra space at the end
if (sb.length() > 0) {
    // in that case remove the space and print the result
    sb.deleteCharAt(sb.length() - 1);
    System.out.println(sb);
}
private String read(Scanner input) {
    if (!input.hasNext()) {
        return "";
    }
    String head = input.nextLine();
    if (input.hasNext()) {            
        return head + " " + read(input);
    }
    else {
        return head;
    }
}